У меня есть сетка данных, в которой есть два столбца шаблона с использованием ComboBox. Второй из них должен быть заполнен в зависимости от первого. Вот урезанный пример моего класса:
public class Customer
{
public int ID { get;set; }
// Other Fields
public string DropdownValue1 { get;set; }
public string DropdownValue2 { get;set; }
public List<DropdownItem> Options1 { get;set; } // DropdownItem is another class of 3 strings called Text, Value and Group
public List<DropdownItem> Options2 { get;set; }
public List<DropdownItem> FilteredItems
{
get { return Options2.Where(n => n.Group == DropdownValue1); }
}
}
При получении данных и создании списка для этого класса, т.е. списка и его заполнении, я устанавливаю соответствующие параметры:
customer.ID = id;
DropdownValue1 = dropdown1;
DropdownValue2 = dropdown2;
Options1 = GetOptions1(); // i.e. returns List<DropdownItem> with manual populated items
Options2 = GetOptions2();
Элемент ItemsSource таблицы данных установлен в эту коллекцию, и затем сами столбцы записываются следующим образом:
<DataGridTemplateColumn Header="Dropdown 1" HeaderStyle="{StaticResource WrappedColumnHeaderStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding>
<MultiBinding.Converter>
<local:DropdownConverter />
</MultiBinding.Converter>
<Binding Path="DropdownValue1" />
<Binding Path="Options1" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding DropdownValue1}" SelectedValuePath="Value" DisplayMemberPath="Text" ItemsSource="{Binding Path=Options1}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Dropdown 2" HeaderStyle="{StaticResource WrappedColumnHeaderStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding>
<MultiBinding.Converter>
<local:GroupDropdownConverter />
</MultiBinding.Converter>
<Binding Path="DropdownValue2" />
<Binding Path="Options2" />
<Binding Path="DropdownValue1" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding DropdownValue2}" SelectedValuePath="Value" DisplayMemberPath="Text" ItemsSource="{Binding Path=FilteredItems}"></ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Все это работает нормально, за исключением случаев, когда изменяется первый столбец, вторая выпадающая ячейка или шаблон редактирования не обновляется с правильными значениями, пока полностью не выйдет из строки. Он обновляется, но не после редактирования отдельной ячейки.
Я добавил INotifyPropertyChanged в свой класс, т.е. класс Customer: INotifyPropertyChanged, и поместил OnPropertyChanged () в установщик для обоих свойств DropdownValue, но это не изменилось.
Как я могу гарантировать, что второй столбец будет обновлен, как только будет изменен первый столбец, не выходя из строки первым?