Loading

WPF MVVM 集合内容更改时如何添加操作,触发通知

用过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; }
            set
            {
                this.datasource = value;
                RaisePropertyChanged(() => Datasource);
            }
        }

        private volatile ObservableCollection<DownLoadModel> downloadSource;
        public ObservableCollection<DownLoadModel> DownloadSource
        {
            get { return this.downloadSource; }
            set
            {
                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));
        }

第二步就是将业务绑定到集合更改的事件上。

第四步就是发出我们的集合绑定方法,传入参数是集合更改的操作类型和更改的对象。并且执行第二步的绑定到事件的业务方法

posted @ 2020-06-06 13:59  BruceNeter  阅读(2127)  评论(0编辑  收藏  举报