如何为数据绑定启用属性更改

本文关键字:属性 启用 数据绑定 | 更新日期: 2023-09-27 18:09:22

假设我有一个虚拟机已经实现了INotifyPropertyChange:

public class MyViewModel{
  public MyClass{get;set;}
  ...
}

但普通类MyClass没有实现INotifyPropertyChange,它只持有一些属性,如:

public class MyClass
    {
        public MyClass()
        {
        }
        public string P1 { get; set; }
    ... 
    }

在xaml中,DataContext是MyViewModel。我这样设置绑定:

Text = "{Binding MyClass.P1}"

然后在MyViewModel构造函数中,我设置了MyClass的实例并进行了属性更改,如

this.RaisePropertyChanged("MyClass");

,但是UI中没有显示P1的值。如何实现这样的东西。raisepropertychanged("MyClass.P1")在这种情况下?

如何为数据绑定启用属性更改

你不能。
您需要在拥有该属性的类中实现INotifyPropertyChanged

如果你不能让这个类实现INotifyPropertyChanged,你应该创建一个单独的ViewModel类来包装它并实现INotifyPropertyChanged

没有办法做到这一点。最好的选择是将这个值包装在ViewModel中,这将允许您直接在ViewModel上引发PropertyChanged事件。

但是,如果由于某种原因不能使用这个选项,则可以调用:

this.RaisePropertyChanged(string.Empty);

这将刷新视图上的所有绑定,包括MyClass.P1。然而,从性能的角度来看,这并不总是一个很好的解决方案,因为它强制进行完整的绑定刷新。

你可以有一个事件的名字跟在这个模板后面:

public event EventHandler <PropertyName>Changed;
public event EventHandler P1Changed;

绑定将"自动检测"P1Changed事件并将其用于数据绑定。

您所需要做的就是在需要时引发P1Changed事件。

添加一个MyClass类型的属性到ViewModel。在属性的setter中是你调用RaisePropertyChanged()的地方。

例如,

    public MyClass SomeName
    {
        get
        {
            return this._SomeName;
        }
        set
        {
            if (value != this._SomeName)
            {
                this._SomeName = value;
                this.RaisePropertyChanged("SomeName");
            }
        }
    }
    private MyClass _SomeName;