2013-01-03 6 views
14

Ich habe eine SQL-DB und implementiere eine WPF-Benutzeroberfläche, um sie zu aktualisieren. Wenn ich EF5 zum Generieren der Klassen aus der Datenbank verwende, wie kann ich INotifyPropertyChanged für die generierten Klassen und Eigenschaften implementieren, sodass ich sie problemlos mit der Benutzeroberfläche binden kann? Gibt es einen einfachen Weg, dies zu erreichen?Implementieren Sie INotifyPropertyChanged für generierte Entity Framework-Klassen

Dank

Antwort

13

Wenn Sie die empfohlene MVVM Muster für WPF folgen, können Sie Ihre generierten Klassen als Modell, behandeln und dann Ansichtsmodell Wrapper schreiben, die INotifyPropertyChanged implementieren. Die ViewModel-Klassen greifen auf Ihre DB-Klassen zu und legen Eigenschaften offen, die Sie in XAML an Ihre Benutzeroberfläche binden können.

Wie in Ihrem Kommentar erwähnt, kann dies zu einer Menge Arbeit führen Schreiben von Code, aber es gibt einige Möglichkeiten, damit umzugehen. Einige Ideen finden Sie unter this question.

Während zunächst mehr Arbeit geleistet wird, kann sich das MVVM-Muster langfristig auf jeden Fall auszahlen, wenn Sie Zwischenformatierungen oder -verarbeitungen vornehmen oder die Datenbankklassen ändern müssen, ohne die Benutzeroberfläche zu beeinträchtigen.

+1

Wenn ich zum Beispiel 'Klasse Asset {public int id {get; set;}}} generiert hätte, würde ich' class AssetWrap schreiben: Asset, INotifyPropertyChanged {public int idNotify {get {return id; } set {id = Wert; NotifyPropertyChanged();}}} 'Wenn dies der Fall ist, erscheint dies sehr zeitaufwendig. – Steve

+2

Normalerweise erbt das ViewModel nicht vom Model, sondern hat stattdessen ein Feld mit dem Model-Objekt, also etwas wie 'class AssetWrap: INotifyPropertyChanged {private Asset _asset; public int idNotify {get {return _asset.id; } set {_asset.id = Wert; NotifyPropertyChanged();}} '(Das ist nicht ganz abgeschlossen). Und ja, manchmal haben Sie am Ende eine Menge mühsamer Muster mit dem MVVM-Muster, aber es zahlt sich aus, wenn Sie eine Zwischenverarbeitung durchführen oder ändern müssen, wie das Modell angezeigt wird.Ich habe einen Link zu einer anderen Frage, die einige Ideen zur Reduzierung dieser Arbeitslast hat. – WildCrustacean

+0

Ich kann den Vorteil von MVVM sehen, aber sie brauchen wirklich einige MVVM-Generatoren nicht, da viele davon oft der gleichen Vorlage folgen. – Steve

5

Ich musste das gleiche vor kurzem aber mit Winforms tun. Wenn Sie dem MVVM-Muster nicht folgen möchten, wie von bde vorgeschlagen, können Sie die t4-Vorlage ändern, um INotifyPropertyChanged für Ihre generierten Entitäten zu implementieren.

Diese Antwort hat mir geholfen: https://stackoverflow.com/a/12192358/1914530

1

Sie können die EF-Vorlage (.tt-Datei) bearbeiten das Property Material auf Ihrer Eigenschaft oder (ein bisschen riskant :)) zu erzeugen, um die generierten Klassen zu bearbeiten. Die letzte ist ein bisschen riskant, denn wenn Sie das Modell neu generieren, gehen alle Änderungen verloren. Vielleicht ist die Variante mit den Wrapper-Klassen oder der Template-Bearbeitung (ein bisschen schwer: S) die beste.

1

Es gibt ein NuGet-Paket mit dem Namen PropertyChanged.Fody, das das Hinzufügen von INotifyPropertyChanged zu einer Klasseneigenschaft sehr einfach macht. Nachdem Sie das Paket installiert haben, fügen Sie einfach das [ImplementPropertyChanged] -Attribut einer Klasse oder Teilklasse hinzu, und das Paket fügt INotifyPropertyChanged für Sie hinzu.

Hier ist ein einfaches Beispiel der Verwendung;

using PropertyChanged; 

[ImplementPropertyChanged] 
public partial class Order 
{ 
} 

Weitere Informationen finden Sie unter GitHub.

0

Lassen Sie alle von EF generierten Klassen von einer Klasse erben, die die Schnittstelle INotifyPropertyChanged implementiert (mithilfe der nicht generierten partiellen Klassen, die Sie wahrscheinlich bereits definiert haben). Fügen Sie dieser Basisklasse eine Methode hinzu, die das Ereignis PropertyChanged mit einer leeren Zeichenfolge wie PropertyName auslöst. Jedes Mal, wenn Sie diese Methode für eine EF-generierte Klasseninstanz aufrufen, werden alle geänderten Eigenschaften in Ihrer WPF-Benutzerschnittstelle aktualisiert.

Verwandte Themen