Уведомление об обновлении WPF привязки для вложенного свойства при изменении родительского свойства
У меня есть ViewModel со сложным типом свойства и хочу привязать мое представление к вложенному свойству этого объекта.
My ViewModel реализует INotifyPropertyChanged
(или выполняет extact BaseViewModel
). Класс родительского свойства не реализует INotifyPropertyChanged
.
Когда я обновляю значение родительского свойства, вложенное свойство не обновляется. Можете ли вы рассказать мне, как я могу реализовать эту функциональность?
ViewModel
public class ViewModel : BaseViewModel
{
private Car _myCarProperty;
public Car MyCarProperty
{
get { return _myCarProperty; }
set
{
if (value == _myCarProperty) return;
_myCarProperty = value;
OnPropertyChanged();
}
}
}
Связывание в представлении
<TextBlock Text="{Binding Path=MyCarProperty.Manufacturer}" />
Когда я изменяю значение MyCarProperty
, представление не обновляется.
Спасибо за любую помощь!
Изменить: реализация OnPropertyChanged()
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion INotifyPropertyChanged
Ответы
Ответ 1
"Класс Car не реализует INotifyPropertyChanged. Но я не изменяю свойство Manufacturer, я изменяю свойство MyCarProperty, и поэтому я ожидаю, что событие OnNotifyPropertyChanged вызовет обновление значения?"
Нет, это не приведет к тому, что значение обновит уровень вниз. Привязки не прослушивают изменения свойств для всего пути, они слушают только объект, к которому они привязаны.
Я вижу пару вариантов с верхней части головы (в порядке моих предпочтений, когда я сталкиваюсь с этим):
Я знаю, что на пути к шаблону данных намного больше узнать, но я обещаю вам, что шаблоны данных окажутся намного более мощными, масштабируемыми, удобными и полезными, чем привязки вручную, когда вы будете работать больше в WPF. (Кроме того, как только вы их понимаете, я думаю, что на самом деле они меньше работают, чем ручные привязки).
Удачи!
Ответ 2
Я не эксперт WPF, но думаю, потому что вы выбрали неправильный путь.
<TextBlock Text="{Binding Path=MyCarProperty, Value=Manufacturer}" />
обновление:
<TextBlock Text="{Binding Source=MyCarProperty, Path=Manufacturer}" />