zoukankan      html  css  js  c++  java
  • 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));
            }

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

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

  • 相关阅读:
    PHP函数正则表达式函数
    PHP函数变量函数
    Passing Wpf Objects Between Threads (With Source Code)
    分手后,何必再要做朋友?
    享受爱,给予爱
    人生如戏
    深夜电话
    我们也要在不同的事情上面有不同的哲学的情况,才行
    幸 福
    你的平安夜是这样过的吗?
  • 原文地址:https://www.cnblogs.com/qwqwQAQ/p/13054478.html
Copyright © 2011-2022 走看看