C# 如何为数据绑定启用属性更改?
假设我的VM实现了INotifyPropertyChange: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;
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;}
不会编译。