2015-08-19 14 views
9

Ho una classe che deve chiamare un metodo NotifyPropertyChanged quando viene modificata una delle sue proprietà. Quello che ho visto negli esempi è qualcosa del tipo:Codice ridondante nei getter e 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(); } 
} 
// ....... 

Questo è davvero il modo idiomatico di farlo? Richiede diverse linee di caldaia per ogni proprietà che voglio aggiungere. Inoltre, se voglio cambiare il nome della proprietà e del campo, dovrei cambiare 4 cose diverse. Sembra una violazione di ASCIUTTO.

+0

Ci sono framework MVVM che possono rendere questo ASCIUTTO, come MVVM Light https://mvvmlight.codeplex.com/! – Fals

risposta

2

Si potrebbe provare a utilizzare un framework AOP per implementare il proprio INotifyPropertyChanged. Il mio preferito per questo esempio si chiama Fody.

Si potrebbe scrivere la classe come questo ...

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

Fody funziona riscrivendo la DLL dopo MsBuild è fatto con esso, per implementare il codice INPC.

+0

Ho accettato questa risposta perché era quella che ho finito usando. – Arcinde

4

Sì, questo è il modo idiomatico di aumentare PropertyChanged. Non c'è un modo semplice per aggirarlo, dal momento che il setter ha bisogno di una chiamata di metodo aggiuntiva e l'unico modo per farlo è con una proprietà completa e un campo di supporto.

In realtà era peggio, come prima di .NET 4.5 si doveva passare il nome della proprietà come stringa a "NotifyPropertyChanged", quindi cambiare il nome ora è un po 'più semplice.

Detto questo, esistono framework (MVVMLight, Caliburn.Micro) che inietteranno l'evento raise per te se scegli di utilizzarli. Certo, ti stanno solo dando un po 'di zucchero sintetico e il risultato finale è lo stesso.

0

PostSharp (https://www.postsharp.net/model/inotifypropertychanged) è un'altra opzione in fase di compilazione per la generazione automatica dell'innalzamento di eventi INotifyPropertyChanged che utilizza gli attributi per indicare i metodi per cui questo dovrebbe essere eseguito.