Ячейка WPF DataGrid привязана к Property of Property в объекте домена, не обновляющем
Я попытался решить эту проблему с нескольких точек зрения. Здесь я попытался упростить его в небольшой тестовый пример.
У меня проблемы с обновлением ячейки DataGrid, связанной с свойством свойства. Свойство задается связанной ячейкой ComboBox в другом столбце. Связанный объект является следующим: со свойством я имею в виду:
public class MainObject : INotifyPropertyChanged
{
private int _subObjectId;
public virtual SubObject SubObjectObj { get; set; }
public int SubObjectId {
get { return _subObjectId; }
set { _subObjectId = value; SubObjectObj = <GetObjFromDB> };
}
...
}
public class SubObject : INotifyPropertyChanged
{
public int Id { get; set; }
public string Name { get; set; }
public string Specialty{ get; set; }
...
}
Элемент ItemsGrid ItemsSource
public ObservableCollection<MainObject> SourceData;
Теперь столбец в DataGrid представляет собой выбор ComboBox для выбора SubObject. Столбец TextBox рядом с ним, который (предположительно) отображает SubObject.Specialty любого SubObject, выбранного в ComboBox.
<DataGridTemplateColumn Header="SubObjects">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SubObject.Name, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="ComboBoxSubObject" ItemsSource="{Binding Model.SubObjects, RelativeSource={RelativeSource AncestorType={x:Type uch:TestControl}}}"
DisplayMemberPath="Name"
SelectedValuePath="Id"
SelectedValue="{Binding SubObjectId, UpdateSourceTrigger=PropertyChanged}"
SelectionChanged="ComboBoxDoctor_OnSelectionChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Specialty" Binding="{Binding Path=SubObjectObj.Specialty}"/>
Когда сетка изначально окрашена, столбец Specialty правильный - это свойство - это то, что SubObject отображается в другом столбце. Но когда я меняю ComboBox, столбец Speciality не изменяется. Должно ли все-таки сообщить DataGrid, что источник привязки столбца Specialty был изменен и обновлен?
Спасибо за любой совет.
Должно ли все-таки сообщить DataGrid, что источник привязки столбца Specialty был изменен и обновлен?
Да, это то, где ваша реализация INotifyPropertyChanged
вступает в игру. Вы должны иметь событие OnPropertyChanged как часть этой реализации, вызывая это событие с именем свойства, сообщает WPF, что значение свойства изменилось и обновил пользовательский интерфейс. Вы должны вызвать OnPropertyChanged
для свойства Speciality
когда ваш SubObject
изменится. Поскольку они находятся в разных классах, вам, вероятно, придется выставить метод или событие для этого:
public class SubObject : INotifyPropertyChanged
{
public int Id { get; set; }
public string Name { get; set; }
public string Specialty{ get; set; }
public void OnSpecialityChanged()
{
OnPropertyChanged("Speciality");
}
}
public class MainObject : INotifyPropertyChanged
{
private int _subObjectId;
public virtual SubObject SubObjectObj { get; set; }
public int SubObjectId
{
get { return _subObjectId; }
set
{
_subObjectId = value;
SubObjectObj = <GetObjFromDB>
SubObjectObj.OnSpecialityChanged();
}
}
}
Боковой момент, я не уверен, что здесь используется ваше свойство SubObjectId. Не могли бы вы вместо этого использовать свойство Id непосредственно из SubObjectObj?
- Вопросы
- Wpfdatagrid
- Ячейка WPF DataGrid привязана к Property of Property в объекте домена, не обновляющем