2016-07-22 54 views
2

新的世界糧食計劃署(MVVM),這似乎是處理用戶變化的典型方式:WPF OnPropertyChanged重複碼

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(nameof(SomeProperty)); 


      } 
     } 
    } 

對於一個大而複雜的屏幕,這就需要編輯的字段很多,而且處理馬上(不是最後點擊一個按鈕時),這會導致大量的重複代碼。似乎很難保持,如果你有50個或更多的屬性呢?有沒有更好的方法來做到這一點?

回答

0

這裏的救命技巧是使用PropertyChanged.Fody,它在編譯時將INotifyPropertyChanged代碼注入到屬性中,並執行一些其他更聰明的操作。

+0

看起來不錯。我將如何使用它爲特定屬性添加一些自定義內容?意思是除了OnPropertyChanged()我想執行一些其他特定的代碼。 –

+0

我想我在這裏找到了自己的答案:https://github.com/Fody/PropertyChanged/wiki/On_PropertyName_Changed –

0

您可以使用此方法:

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

而且在每個屬性使用這樣的:

private bool someProperty= false; 
    public bool SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      if (someProperty!= value) 
      { 
       someProperty= value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
+0

我的問題是所有7-10行代碼,我寧願每個屬性只有1或2 :) –

+0

@Keith只需使用'PropertyChanged.Fody'工具。 – mechanic

0

我用我所有的ViewModels帶有此功能的基類是:

protected void RaisePropertyChanged(string propertyName) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

protected bool SetValue<T>(ref T backingField, T newValue, [CallerMemberName] string propertyName = "") 
{ 
    if (EqualityComparer<T>.Default.Equals(backingField, newValue)) 
    { 
     return false; 
    } 
    backingField = newValue; 
    RaisePropertyChanged(propertyName); 
    return true; 
} 

然後,您可以從任何子類以這種方式使用它:

private string _firstName; 

public string FirstName 
{ 
    get { return _firstName; } 
    set { SetValue(ref _firstName, value); } 
} 

SetValue將返回true如果新值比以前的值不同,false如果是一樣的,只是在情況下,你需要鏈更復雜的制定者任何進一步的行動。