繁体   English   中英

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

[英]WPF binding update notification for nested property when parent property changes

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

我的 ViewModel 正在实现INotifyPropertyChanged (或者确实BaseViewModel正在实现它)。 父属性的类没有实现INotifyPropertyChanged

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

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

视图模型

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

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

不,它不会触发值更新一个级别。 绑定不侦听整个路径的属性更改,它们只侦听绑定到的对象。

我在脑海中看到了几个选项(按照我遇到这个的偏好顺序):

  1. 绑定到汽车,而不是子属性,并创建一个数据模板来显示您想要的内容。
  2. 在需要时通过在其BindingExpression上调用 UpdateTarget 来手动启动绑定。

我知道它看起来像有很多东西要学数据模板路线上,但我向你保证数据的模板将更加强大,可扩展性,可维护性和有用的证明比手动踢绑定,你在WPF更多的工作。 (另外,一旦你理解了它们,我认为它们实际上比手动踢绑定更少的工作)。

祝你好运!

接受的答案解释了如何处理绑定源上的子属性发生更改并且您希望更新视图的情况 - 这不是问题所要问的。 WPF 实际上会响应从多个级别向下的更改,只要您通知指定路径内更改的任何属性的更改。

至于这个:

“类 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}" />

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

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

更新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM