2013-01-03 17 views
14

Ho un DB SQL e sto implementando un'interfaccia utente WPF per aggiornarlo. Se utilizzo EF5 per generare le classi dal DB, come posso implementare INotifyPropertyChanged sulle classi e proprietà generate in modo da potermi facilmente associare con l'interfaccia utente? C'è un modo semplice per raggiungere questo obiettivo?Implementare INotifyPropertyChanged su classi Entity Framework generate

Grazie

risposta

13

Se si segue la MVVM modello raccomandato per WPF, è possibile trattare le vostre classi generate come il modello, e poi scrivere wrapper ViewModel che implementano INotifyPropertyChanged. Le classi ViewModel accedono alle classi DB ed espongono le proprietà che è possibile associare all'interfaccia utente in XAML.

Come indicato nel commento, questo può comportare un sacco di lavoro durante la scrittura del codice boilerplate, ma ci sono alcuni modi per affrontarlo. Vedi this question per alcune idee.

Mentre più lavoro in un primo momento, il pattern MVVM può sicuramente ripagare nel lungo periodo se è necessario eseguire qualsiasi formattazione o elaborazione intermedia o se è necessario modificare le classi del database senza influire sull'interfaccia utente.

+1

Ad esempio, se avessi generato la classe Asset {public int id {get; set}} 'Scriverò' class AssetWrap: Asset, INotifyPropertyChanged {public int idNotify {get {return id; } set {id = value; NotifyPropertyChanged();}}} 'Se è così, ciò sembra richiedere molto tempo. – Steve

+2

In genere ViewModel non eredita dal modello, ma ha un campo con l'oggetto Model, quindi qualcosa come 'class AssetWrap: INotifyPropertyChanged {private Asset _asset; public int idNotify {get {return _asset.id; } set {_asset.id = value; NotifyPropertyChanged();}} '(questo non è completamente completo). E sì, a volte ci si ritrova con un sacco di noioso boilerplate con il pattern MVVM, ma ciò si ripaga se è necessario eseguire alcune elaborazioni intermedie o modificare la modalità di visualizzazione del modello.Inserisco un collegamento a un'altra domanda che ha alcune idee per ridurre questo carico di lavoro. – WildCrustacean

+0

Riesco a vedere il vantaggio di MVVM, ma hanno davvero bisogno di alcuni generatori MVVM, visto che spesso seguono lo stesso modello. – Steve

5

Avevo bisogno di fare lo stesso di recente, ma con Winforms. Se non si desidera seguire il modello MVVM come suggerito da bde, è possibile modificare il modello t4 per implementare INotifyPropertyChanged sulle entità generate.

Questa risposta mi ha aiutato: https://stackoverflow.com/a/12192358/1914530

1

È possibile modificare il modello EF (file .tt) per generare la roba PropertyChanged sulle vostre proprietà, o (un po 'rischioso :)) per modificare le classi generate. L'ultimo è un po 'rischioso, perché se si rigenera il modello, tutte le modifiche andranno perse. Quindi forse la variante con le classi wrapper o la modifica del template (un po 'dura: S) sono le migliori.

1

C'è un pacchetto NuGet chiamato PropertyChanged.Fody che rende l'aggiunta di INotifyPropertyChanged a proprietà di classi davvero semplice. Una volta installato il pacchetto, aggiungi l'attributo [ImplementPropertyChanged] a qualsiasi classe o classe parziale e il pacchetto aggiungerà INotifyPropertyChanged per te.

Ecco un semplice esempio del suo utilizzo;

using PropertyChanged; 

[ImplementPropertyChanged] 
public partial class Order 
{ 
} 

Vedere GitHub per ulteriori informazioni.

0

Tutte le classi EF generate ereditano da una classe che implementa l'interfaccia INotifyPropertyChanged (utilizzando le classi parziali non generate che probabilmente sono già state definite). Aggiungi un metodo a questa classe base, che solleva l'evento PropertyChanged con una stringa vuota come PropertyName. Quindi, ogni volta che si chiama questo metodo su un'istanza di classe generata da EF, tutte le sue proprietà modificate verranno aggiornate nell'interfaccia utente di WPF.

Problemi correlati