首页 文章

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

提问于
浏览
12

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

我的ViewModel正在实现 INotifyPropertyChanged (或者正在实现它_981764_) . 父属性的类未实现 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

3 回答

  • 3

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

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

    更新:

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

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

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

    我在头顶看到了几个选项(当我遇到这个时,按照我的偏好顺序):

    • 绑定到汽车,而不是子属性,并创建一个data template,显示您想要的内容 .

    • 在需要时通过调用UpdateTarget BindingExpression来手动踢绑定 .

    我知道在数据模板路线上看起来还有很多东西需要学习,但我保证,与在WPF中工作更多时手动踢绑定相比,数据模板将证明更强大,可扩展,可维护且更有用 . (另外,一旦你了解它们,我认为它们实际上比手动踢绑定更少) .

    祝好运!

  • 17

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

    至于这个:

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

    WPF已经处理过了 .

    在您的示例中, ViewModel 是绑定源 . 当您设置 MyCarProperty (触发 NotifyPropertyChanged 事件)时,WPF将使用 new Binding Source对象的绑定路径重新评估绑定目标值 - 使用新的 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}" />
    

相关问题