当前位置:编程学习 > C#/ASP.NET >>

请问 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上的绑定就是订阅这个事件啊。只是框架全都帮你实现了而已。 --------------------编程问答--------------------
引用 1 楼 ariesget 的回复:
你觉得XAML上面的绑定是干什么的呢?XAML上的绑定就是订阅这个事件啊。只是框架全都帮你实现了而已。


我的问题是  viewmodel 类 实现了 INotifyPropertyChanged 接口, XAML 绑定 viewmodel 的一个属性值,它(框架) 就能知道 注册这个属性所属类 的 PropertyChanged 事件?
--------------------编程问答--------------------
引用 2 楼 sosokc 的回复:
引用 1 楼 ariesget 的回复:你觉得XAML上面的绑定是干什么的呢?XAML上的绑定就是订阅这个事件啊。只是框架全都帮你实现了而已。

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

框架中实现的类里只需要定义一个INotifyPropertyChanged对象变量,然后根据你的绑定把你的ViewModel的实例赋值给这个对象变量,然后订阅他的PropertyChanged 事件,并写个更新UI的委托方法就可以了。当然整个实现没这么简单,你可以用反编译器去看WPF的框架源码 --------------------编程问答-------------------- 对于可binding的任何属性, 只要当前对象的DataContext是实现了INotifyPropertyChanged接口的类,那么Binding 就会去Handle INotifyPropertyChanged的PropertyChanged事件. 当VM中触发了此事件, 自然Binding对象会根据当前Binding中的Mode属性做相应的更新.
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,