WPF:ItemContainerGenerator.Status = 未启动
WPF: ItemContainerGenerator.Status = not started
我有一个数据网格,其中每一列都有一个组合框 header。每个组合框都将其源绑定到可观察到的 collection 字符串。我已经通过隐藏代码实现了所有这些,因为数据网格的列数在设计时是未知的。
当用户选择一个项目时,在每个组合框中,选择更改后应禁用该项目。所以我试着做一个这样的循环:
private void Test_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (vm.myArray == null)
{ vm.myArray = new string[myGrid.Columns.Count]; }
ComboBox cb = sender as ComboBox;
DataGridColumnHeader parent = cb.Parent as DataGridColumnHeader;
int index = parent.Column.DisplayIndex;
string value = cb.SelectedItem as string;
vm.mYArray[index] = value;
foreach(DataGridColumn c in griglia.Columns)
{
foreach(string s in vm.myArray)
{
if(s != null && s != string.Empty)
{
ComboBox dg = c.Header as ComboBox;
for (int i = 0; i < dg.Items.Count; i++)
{
ComboBoxItem it = (ComboBoxItem)dg.ItemContainerGenerator.ContainerFromIndex(i);
if ((string)it.Content == s)
it.IsEnabled = false;
else
it.IsEnabled = true;
}
}
}
}
}
问题是当列上的循环到达第二次迭代时,我的代码引发异常。在深入了解我的局部变量后,我注意到 ItemContainerGenerator.Status 除了第一列中的组合框外,其他地方都没有启动。你能帮我解决这个问题吗?
看来我找到了解决办法。我需要在内循环中添加这段代码:
if(dg.ItemContainerGenerator.Status == GeneratorStatus.NotStarted)
{
dg.IsDropDownOpen = true;
this.UpdateLayout();
dg.IsDropDownOpen = false;
}
看来问题是 ItemContainerGenerator
直到每个 ComboBoxItem
都没有生成时才生成。为此,您应该欺骗 UI 相信每个 ComboBox
至少被打开过一次。
如果您知道更好的答案,请告诉我。
我有一个数据网格,其中每一列都有一个组合框 header。每个组合框都将其源绑定到可观察到的 collection 字符串。我已经通过隐藏代码实现了所有这些,因为数据网格的列数在设计时是未知的。
当用户选择一个项目时,在每个组合框中,选择更改后应禁用该项目。所以我试着做一个这样的循环:
private void Test_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (vm.myArray == null)
{ vm.myArray = new string[myGrid.Columns.Count]; }
ComboBox cb = sender as ComboBox;
DataGridColumnHeader parent = cb.Parent as DataGridColumnHeader;
int index = parent.Column.DisplayIndex;
string value = cb.SelectedItem as string;
vm.mYArray[index] = value;
foreach(DataGridColumn c in griglia.Columns)
{
foreach(string s in vm.myArray)
{
if(s != null && s != string.Empty)
{
ComboBox dg = c.Header as ComboBox;
for (int i = 0; i < dg.Items.Count; i++)
{
ComboBoxItem it = (ComboBoxItem)dg.ItemContainerGenerator.ContainerFromIndex(i);
if ((string)it.Content == s)
it.IsEnabled = false;
else
it.IsEnabled = true;
}
}
}
}
}
问题是当列上的循环到达第二次迭代时,我的代码引发异常。在深入了解我的局部变量后,我注意到 ItemContainerGenerator.Status 除了第一列中的组合框外,其他地方都没有启动。你能帮我解决这个问题吗?
看来我找到了解决办法。我需要在内循环中添加这段代码:
if(dg.ItemContainerGenerator.Status == GeneratorStatus.NotStarted)
{
dg.IsDropDownOpen = true;
this.UpdateLayout();
dg.IsDropDownOpen = false;
}
看来问题是 ItemContainerGenerator
直到每个 ComboBoxItem
都没有生成时才生成。为此,您应该欺骗 UI 相信每个 ComboBox
至少被打开过一次。
如果您知道更好的答案,请告诉我。