假设我有实现了INotifyPropertyChange的VM:
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中。在这种情况下如何实现类似this.RaisePropertyChanged(“MyClass.P1”)的内容?
答案 0 :(得分:2)
你不能。
您需要在拥有该属性的类中实现INotifyPropertyChanged
。
如果你不能使该类实现INotifyPropertyChanged
,你应该创建一个单独的ViewModel类来包装它并实现INotifyPropertyChanged
。
答案 1 :(得分:0)
没有办法做到这一点。最好的选择是在ViewModel中包装此值,这样您就可以直接在ViewModel上引发PropertyChanged
事件。
但是,如果由于某种原因这不是一个选项,另一个选择是调用:
this.RaisePropertyChanged(string.Empty);
这将刷新视图上所有的绑定,包括MyClass.P1
。然而,从性能角度来看,这并不总是一个很好的解决方案,因为它会强制进行完全绑定刷新。
答案 2 :(得分:0)
您可以在此模板后面有一个名称的事件:
public event EventHandler <PropertyName>Changed;
public event EventHandler P1Changed;
绑定将“自动检测”P1Changed
事件,并将其用于数据绑定。
您需要做的就是在需要时举起P1Changed
事件。
答案 3 :(得分:0)
将一个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;