如果想要讓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省去複製重複的程式碼工作。
 
沒有留言:
張貼留言