父属性更改时嵌套属性的WPF绑定更新通知

我有一个具有复杂属性类型的ViewModel,并希望将我的视图绑定到此对象的嵌套属性。

我的ViewModel正在实现INotifyPropertyChanged (或者需要提取BaseViewModel来实现它)。 父属性的类没有实现INotifyPropertyChanged

当我更新父属性的值时,嵌套属性不会更新。 你能告诉我如何实现这个功能?

视图模型

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的值时,View不会更新。

谢谢你的帮助!

编辑: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

“Car类没有实现INotifyPropertyChanged,但我没有更改属性Manufacturer,我更改了MyCarProperty属性,所以我期望OnNotifyPropertyChanged事件会触发值更新?”

不,它不会触发价值更新降低水平。 绑定不会监听整个路径的属性更改,它们只会侦听绑定到的对象。

我看到一些选项偏离了我的头顶(按照我的偏好顺序,当我碰到这个时):

  • 绑定到汽车,而不是子属性,并创建一个数据模板,显示你想要的东西。
  • 在需要时,通过在BindingExpression上调用UpdateTarget来手动启动绑定。
  • 我知道在数据模板路线上学习的内容看起来还有很多,但我向你保证,与在WPF中更多地使用绑定手动绑定相比,数据模板将更加强大,可伸缩,可维护且有用。 (另外,一旦你理解了它们,我认为它们实际上比手动启动绑定的工作更少)。

    祝你好运!


    我不是WPF专家,但我认为这是因为你选择了错误的路径。

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

    更新:

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

    接受的答案解释了如何处理绑定源的子属性发生更改并希望更新视图的情况。

    至于这个:

    “Car类没有实现INotifyPropertyChanged,但我没有更改属性Manufacturer ,我更改了MyCarProperty属性,所以我期望OnNotifyPropertyChanged事件会触发值更新?”

    WPF已经处理了这个。

    在你的例子中, ViewModel是绑定源。 当您设置MyCarProperty (触发NotifyPropertyChanged事件)时,WPF将使用绑定源对象的绑定路径重新评估绑定目标值 - 使用新Manufacturer更新您的视图。

    我已经用一个简单的WPF应用程序测试了它 - 它对于深度嵌套的路径也适用:

    https://pastebin.com/K2Ct4F0F

    <!-- When MyViewModel notifies that "MyCarProperty" has changed, -->
    <!-- this binding updates the view by traversing the given Path -->
    <TextBlock Text="{Binding Path=MyCarProperty.Model.SuperNested[any][thing][you][want][to][try][and][access].Name}" />
    
    链接地址: http://www.djcxy.com/p/44677.html

    上一篇: WPF binding update notification for nested property when parent property changes

    下一篇: SelectedItem property not updating