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

时间:2013-08-14 09:59:50

标签: c# wpf mvvm binding

我有一个具有复杂属性类型的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的值时,视图不会更新。

感谢您的帮助!

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

3 个答案:

答案 0 :(得分:17)

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

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

我看到了几个选项(根据我的偏好,当我遇到这个时):

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

    祝你好运!

答案 1 :(得分:3)

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

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

更新

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

答案 2 :(得分:3)

接受的答案解释了如何处理绑定源上的子属性更改并且您希望更新视图的情况 - 这不是问题所在。事实上,只要您通知在指定路径中更改的任何属性的更改,WPF就会响应多层次的更改。

至于此:

  

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

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