用过mvvm设计WFP程序的人都知道,在我们mvvm中有一个非常重要的接口叫做
INotifyPropertyChanged
这个接口的主要作用是用于触发属性更改时向我们xaml中绑定此属性值的控件发起通知,从而页面响应我们的数据变化。
那么页面绑定的集合发生变化,我如何响应给页面呢?
这时候我们的ObservableCollection集合就出现了,它的作用是在我们的集合修改,添加删除时会向我们的页面发送通知。这样一来我们的操作就方便多了,我们只需要让我们页面上的列表控件绑定上这样的一个数据源,就可以实现更新了。
可是这时候问题又出现了,我们如何在集合变化时添加业务呢?
比如我有一个下载列表和一个上传列表,有一个地方显示目前的上传下载任务数量,我们如何在上传和下载变化时动态改变当前任务数量。
我们可以用非常死的办法,在上传和下载变化的地方都加上刷新当前数量的代码,但是这样不利于维护,并且写起来很累。
ObservableCollection只能根据变化将改变通知到绑定此数据源的控件,INotifyPropertyChanged更是只有集合被赋值的时候才会触发更改。
这时候我们的框架就给我们提供了一个很好用的接口了——
INotifyCollectionChanged
顾名思义,这是微软为了我们提供的一个集合更改触发通知的接口了。我们来看一个例子。
public class TransferViewModel : ViewModelBase, INotifyCollectionChanged
private volatile ObservableCollection<UpLoadProgressModel> datasource;
public ObservableCollection<UpLoadProgressModel> Datasource
get { return this.datasource; }
this.datasource = value;
RaisePropertyChanged(() => Datasource);
private volatile ObservableCollection<DownLoadModel> downloadSource;
public ObservableCollection<DownLoadModel> DownloadSource
get { return this.downloadSource; }
this.downloadSource = value;
RaisePropertyChanged(() => DownloadSource);
上面两个集合,第一个上传第二个下载,并且我们这个类已经实现了INotifyCollectionChanged接口
我们需要实现其中的方法,与INotifyPropertyChanged类似
public event NotifyCollectionChangedEventHandler CollectionChanged;
public virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
CollectionChanged?.Invoke(this, e);
这时候对集合的增删改我们需要生成自己的方法,以添加上传为例
//写入上传队列的事件通知
public void AddUpLoad(UpLoadProgressModel model)
this.Datasource.Add(model);
CollectionChanged += new NotifyCollectionChangedEventHandler(List_CollectionChanged);
RaisePropertyChanged(() => Datasource);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, model));
第二步就是将业务绑定到集合更改的事件上。
第四步就是发出我们的集合绑定方法,传入参数是集合更改的操作类型和更改的对象。并且执行第二步的绑定到事件的业务方法