Ячейка WPF DataGrid привязана к Property of Property в объекте домена, не обновляющем

75
5

Я попытался решить эту проблему с нескольких точек зрения. Здесь я попытался упростить его в небольшой тестовый пример.

У меня проблемы с обновлением ячейки 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 был изменен и обновлен?

Спасибо за любой совет.

спросил(а) 2021-01-19T15:26:54+03:00 2 месяца, 3 недели назад
1
Решение
62

Должно ли все-таки сообщить 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?

ответил(а) 2021-01-19T15:26:54+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема