2016-07-22 16 views
2

Neu bei WFP (MVVM), das ist die typische Art und Weise zu sein scheint Benutzer Änderungen zu handhaben:WPF OnPropertyChanged Wiederholungscode

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


      } 
     } 
    } 

Für einen großen und komplexen Bildschirm mit vielen Feldern, die bearbeitet werden müssen, und behandeln sofort (nicht am Ende, wenn Sie auf eine Schaltfläche klicken), würde dies zu einer Menge von Art von Code wiederholen. Scheint wirklich schwer zu warten, was ist, wenn du 50 oder mehr Eigenschaften hast? Gibt es einen besseren Weg, es zu tun?

Antwort

0

Die lebenserhaltende Technik ist hier zu verwenden PropertyChanged.Fody, die INotifyPropertyChanged Code in Eigenschaften zur Kompilierzeit injiziert, und tut einige andere noch schlauere Sachen.

+0

sieht gut aus. Wie würde ich das verwenden, um einige benutzerdefinierte Sachen für bestimmte Eigenschaften hinzuzufügen? Das bedeutet, dass ich neben OnPropertyChanged() noch einen anderen spezifischen Code ausführen möchte. –

+0

Ich denke, ich fand meine eigene Antwort hier: https://github.com/Fody/PropertyChanged/wiki/On_PropertyName_Changed –

0

Sie diese Methode verwenden kann:

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

und die Verwendung es so in jeder Eigenschaft:

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

Mein Problem war mit allen 7-10 Zeilen Code, ich hätte lieber nur 1 oder 2 für jede Eigenschaft :) –

+0

@Keith Verwenden Sie einfach das 'PropertyChanged.Fody'-Tool. – mechanic

0

Ich benutze eine Basisklasse für all meine Viewmodel mit diesen Funktionen in ihm:

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; 
} 

Sie können es dann von jeder Unterklasse auf diese Weise verwenden:

SetValue wird true zurück, wenn der neue Wert als der vorherige Wert abweicht, und false wenn es das gleiche ist, nur für den Fall, dass Sie an der Kette müssen weitere Aktionen für komplexere Setzer.