用過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)); }
第二步就是將業務綁定到集合更改的事件上。
第四步就是發出我們的集合綁定方法,傳入參數是集合更改的操作類型和更改的對象。並且執行第二步的綁定到事件的業務方法