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));
        }

第二步就是將業務綁定到集合更改的事件上。

第四步就是發出我們的集合綁定方法,傳入參數是集合更改的操作類型和更改的對象。並且執行第二步的綁定到事件的業務方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章