请问 MVVM 中INotifyPropertyChanged 接口 怎样通知控件更新的?
public class SongViewModel : INotifyPropertyChanged{
#region Construction
/// Constructs the default instance of a SongViewModel
public SongViewModel()
{
_song = new Song { ArtistName = "Unknown", SongTitle = "Unknown" };
}
#endregion
#region Members
Song _song;
#endregion
#region Properties
public Song Song
{
get
{
return _song;
}
set
{
_song = value;
}
}
public string ArtistName
{
get { return Song.ArtistName; }
set
{
if (Song.ArtistName != value)
{
Song.ArtistName = value;
RaisePropertyChanged("ArtistName");
}
}
}
#endregion
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region Methods
private void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
在这个例子中,这个 viewmodel 类,实现了 INotifyPropertyChanged 接口,但是 它并没有实现 PropertyChanged 的监听事件处理,只是 在属性发生改变时候 调用RaisePropertyChanged(string propertyName),而这个 RaisePropertyChanged 是在PropertyChanged 不空时候 调用这个处理。
我的问题是 在这个 viewmodel 属性ArtistName 改变时候,会调用 PropertyChanged ,怎样 通知到 view中的 binding ArtistName 的 控件发生改变的呢? 事实上 WPF 或silverlight 中绑定 ArtisName的 控件 确实会跟随改变 --------------------编程问答-------------------- 你觉得XAML上面的绑定是干什么的呢?XAML上的绑定就是订阅这个事件啊。只是框架全都帮你实现了而已。 --------------------编程问答--------------------
我的问题是 viewmodel 类 实现了 INotifyPropertyChanged 接口, XAML 绑定 viewmodel 的一个属性值,它(框架) 就能知道 注册这个属性所属类 的 PropertyChanged 事件?
--------------------编程问答--------------------
框架中实现的类里只需要定义一个INotifyPropertyChanged对象变量,然后根据你的绑定把你的ViewModel的实例赋值给这个对象变量,然后订阅他的PropertyChanged 事件,并写个更新UI的委托方法就可以了。当然整个实现没这么简单,你可以用反编译器去看WPF的框架源码 --------------------编程问答-------------------- 对于可binding的任何属性, 只要当前对象的DataContext是实现了INotifyPropertyChanged接口的类,那么Binding 就会去Handle INotifyPropertyChanged的PropertyChanged事件. 当VM中触发了此事件, 自然Binding对象会根据当前Binding中的Mode属性做相应的更新.
补充:.NET技术 , C#