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