2015-08-19 15 views
9

Ich habe eine Klasse, die eine Methode NotifyPropertyChanged aufrufen muss, wenn eine seiner Eigenschaften geändert wird. Was ich in Beispielen gesehen habe, ist etwas wie:Redundanter Code in Getter und Setter

private string property1_; 
public string Property1 
{ 
    get { return property1_; } 
    set { property1_ = value; NotifyPropertyChanged(); } 
} 
private string property2_; 
public string Property2 
{ 
    get { return property2_; } 
    set { property2_ = value; NotifyPropertyChanged(); } 
} 
// ....... 

Ist das wirklich die idiomatische Art, es zu tun? Es erfordert mehrere Zeilen für jede Eigenschaft, die ich hinzufügen möchte. Außerdem, wenn ich den Namen der Eigenschaft und des Feldes ändern möchte, müsste ich 4 verschiedene Dinge ändern. Es scheint eine Verletzung von DRY zu sein.

+0

Es gibt MVVM-Frameworks, die dieses TROCKEN machen können, wie MVVM Light https://mvvmlight.codeplex.com/! – Fals

Antwort

2

Sie könnten versuchen, ein AOP-Framework zu verwenden, um Ihre INotifyPropertyChanged zu implementieren. Mein persönlicher Favorit für dieses Beispiel ist Fody. genannt

Sie würden die Klasse wie folgt schreiben ...

[ImplementPropertyChanged] 
public class Foo 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

Fody funktioniert durch die dll Umschreiben nach MsBuild mit ihr geschehen ist, wird Ihr INPC Code zu implementieren.

+0

Akzeptiert diese Antwort, weil es die war, die ich am Ende benutzt habe. – Arcinde

4

Ja, das ist der idiomatische Weg, um PropertyChanged zu erhöhen. Es gibt keinen einfachen Weg, da der Setter einen zusätzlichen Methodenaufruf benötigt und der einzige Weg, dies zu tun, ist eine vollständige Eigenschaft und ein unterstützendes Feld.

Früher war es noch schlimmer, wie vor .NET 4.5 mussten Sie den Eigenschaftsnamen als String an "NotifyPropertyChanged" übergeben, daher ist es jetzt einfacher, den Namen zu ändern.

Das heißt, es gibt Frameworks (MVVMLight, Caliburn.Micro), die die Ereigniserhöhung für Sie injizieren, wenn Sie sie verwenden möchten. Natürlich geben sie dir nur ein bisschen syntaktischen Zucker, und das Endergebnis ist dasselbe.