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的 控件 确实会跟随改变

解决方案 »

  1.   

    你觉得XAML上面的绑定是干什么的呢?XAML上的绑定就是订阅这个事件啊。只是框架全都帮你实现了而已。
      

  2.   


    我的问题是  viewmodel 类 实现了 INotifyPropertyChanged 接口, XAML 绑定 viewmodel 的一个属性值,它(框架) 就能知道 注册这个属性所属类 的 PropertyChanged 事件?
      

  3.   

    框架中实现的类里只需要定义一个INotifyPropertyChanged对象变量,然后根据你的绑定把你的ViewModel的实例赋值给这个对象变量,然后订阅他的PropertyChanged 事件,并写个更新UI的委托方法就可以了。当然整个实现没这么简单,你可以用反编译器去看WPF的框架源码
      

  4.   

    对于可binding的任何属性, 只要当前对象的DataContext是实现了INotifyPropertyChanged接口的类,那么Binding 就会去Handle INotifyPropertyChanged的PropertyChanged事件. 当VM中触发了此事件, 自然Binding对象会根据当前Binding中的Mode属性做相应的更新.