假设我有一个虚拟机已经实现了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;