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

C# 如何为数据绑定启用属性更改?,c#,silverlight,mvvm,C#,Silverlight,Mvvm,假设我的VM实现了INotifyPropertyChange: public class MyViewModel{ public MyClass{get;set;} ... } 但是普通类MyClass没有在INotifyPropertyChange中实现,它只保存一些属性,如: public class MyClass { public MyClass() { } public string P1 { get;

假设我的VM实现了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");
但P1的值不显示在UI中。在这种情况下,如何实现这样的东西。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;

publicmyclass{get;set;}
不会编译。