Уведомление об обновлении WPF привязки для вложенного свойства при изменении родительского свойства - программирование
Подтвердить что ты не робот

Уведомление об обновлении 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
4b9b3361

Ответ 1

"Класс Car не реализует INotifyPropertyChanged. Но я не изменяю свойство Manufacturer, я изменяю свойство MyCarProperty, и поэтому я ожидаю, что событие OnNotifyPropertyChanged вызовет обновление значения?"

Нет, это не приведет к тому, что значение обновит уровень вниз. Привязки не прослушивают изменения свойств для всего пути, они слушают только объект, к которому они привязаны.

Я вижу пару вариантов с верхней части головы (в порядке моих предпочтений, когда я сталкиваюсь с этим):

Я знаю, что на пути к шаблону данных намного больше узнать, но я обещаю вам, что шаблоны данных окажутся намного более мощными, масштабируемыми, удобными и полезными, чем привязки вручную, когда вы будете работать больше в WPF. (Кроме того, как только вы их понимаете, я думаю, что на самом деле они меньше работают, чем ручные привязки).

Удачи!

Ответ 2

Я не эксперт WPF, но думаю, потому что вы выбрали неправильный путь.

<TextBlock Text="{Binding Path=MyCarProperty, Value=Manufacturer}" />

обновление:

<TextBlock Text="{Binding Source=MyCarProperty, Path=Manufacturer}" />