2013年5月22日 星期三

[W8App] ListBox Binding data (2) – INotifyPropertyChanged item

如果想要讓UI與Binding data能動態的更新,那麼Binding Item必需繼承自INotifyPropertyChanged,當Binding的屬性改變時,送出PropertyChanged的事件讓UI知悉。

繼承自INotifyPropertyChanged的item大概都長的像下面這段程式碼一樣:

   1: public class myItem : INotifyPropertyChanged
   2: {
   3:     public event PropertyChangedEventHandler PropertyChanged;
   4:  
   5:     protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
   6:     {
   7:         if (object.Equals(storage, value)) return false;
   8:  
   9:         storage = value;
  10:         OnPropertyChanged(propertyName);
  11:         return true;
  12:     }
  13:  
  14:     protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
  15:     {
  16:         var eventHandler = PropertyChanged;
  17:         if (eventHandler != null)
  18:         {
  19:             eventHandler(this, new PropertyChangedEventArgs(propertyName));
  20:         }
  21:     }
  22: }

必需實作三件事:
#3 要有PropertyChangedEventHandler
#9 要儲存set value
#19 要發送出屬性改變的事件


將Binding的屬性透過SetProperty<T>儲存並送出事件,如ImagePath屬性:



   1: public String ImagePath
   2: {
   3:     set { SetProperty<String>(ref _strImagePath, value); }
   4:     get { return _strImagePath; }
   5: }

#3 SetProperty的第三個參數為預設引數時,並不是真的為空字元,而是屬性的名稱(如本例為”ImagePath”)。





PS:如果開發的Project是使用VS2012的Grid App 或 Split App的專案時,當專案建立完成時可在的專案的Common目錄下找到BindableBase class,BindableBase已完成INotifyPropertyChanged所需實作的函式,可直接繼承自BindableBase省去複製重複的程式碼工作。

沒有留言:

張貼留言