2016-05-27 6 views
0

Verwenden von WPF (MVVM, MVVM Light, Fody PropertyChanged), Entity Framework 6.1.3.WPF - UI/Bindings auf geladene Entität aktualisieren

Ich habe folgendes Modell.

// The INotifyPropertyChanged is generated by Fody. 
public class Person : INotifyPropertyChanged 
{ 
    public string Name { get; set; } 

    // Assume that INotifyPropertyChanged is properly implemented. 
} 

Das folgende allgemeine abstrakte Ansicht Modell:

public abstract class ViewModel<T> where T : class, new() 
{ 
    public T Entity { get; set; } 

    // Entity Framework repository (add, get, find, delete...) 
    internal abstract IRegister<T> EntityRegister { get; set; } 

} 

Und die Person View Modell:

public class PersonViewModel : ViewModel<Person> 
{ 
    // Person specific implementations... 
    ... 
} 

Und ein einfaches Textfeld WPF zur Entity.Name Eigenschaft zu binden.

<TextBox Text="{Binding Entity.Name, 
           UpdateSourceTrigger=PropertyChanged, 
           Mode=TwoWay}" /> 

Das Problem:

Immer, wenn ich lade (finden) ein Unternehmen meiner Meinung nach Modell, zum Beispiel:

Entity = EntityRegister.Find(10); // The Entity primary key. 

die Benutzeroberfläche nicht mit der neuen geladenen Einheit aktualisiert wird, I eine Menge Beiträge gefunden, die vorschlagen, die PropertyChanged mit null oder 10 Argumente aufrufen, um das Ereignis PropertyChanged für alle Eigenschaften zu erhöhen.

Da ich Fody's PropertyChanged verwende, wird das INotifyPropertyChanged nur zur Laufzeit in mein Modell eingefügt, also muss ich es dynamisch aufrufen.

dynamic entity = Entity; 
entity.OnPropertyChanged(string.Empty); 

Ich habe auch durch Reflexion versucht:

var method = typeof(T).GetMethod("OnPropertyChanged"); 
method.Invoke(Entity, new object[] { string.Empty }); 

Sie alle laufen, ohne Ausnahmen, aber sie tun nichts, die UI-Bindung ist nie aufgefrischt, was mache ich falsch? Das Textfeld wird nur aktualisiert, wenn ich es scharfstelle und eine Taste drücke, dann wird der Wert des Textfelds aktualisiert.

Danke.

Die Antwort:

Statt OnPropertyChanged für jede Eigenschaft des Entity Objekt des Aufrufens, rufen Sie einfach OnPropertyChanged für die ganze Entity Objekt.

OnPropertyChanged("Entity"); 

So einfach ist das, wird die UI mit dem ganzen Entity Objekt aktualisiert. Viel einfacher, viel einfacher.

+0

Beim Debuggen ist es am besten, nichts anzunehmen. Damit Aktualisierungen stattfinden können, müssen ein Datenkontext, zu aktualisierende Werte und eine Benachrichtigung an das Eigenschaftensystem vorhanden sein. Erste Frage: Wenn Sie einen Breakpoint auf die Entity-Zuweisung setzen, gibt es dort etwas? Zweite Frage: Wo ist der Datenkontext festgelegt? Dritte Frage ... Die geänderte Eigenschaft hat einen Namen und Wert, werden beide gesendet? –

Antwort

1

Der Grund, warum die Benutzeroberfläche die Eigenschaften der Entität nicht aktualisiert, liegt daran, dass die Ansicht nicht erkennt, dass sie sich geändert haben, weil die Entitätseigenschaft der Benutzeroberfläche nicht mitgeteilt hat, dass sie geändert wurde. (Ich hoffe, dass Sinn gemacht)

Wenn Sie die Einheit wie folgt setzen:

Entity = EntityRegister.Find(10); 

Dann Sie INotifyPropertyChanged auf der Entity Eigenschaft Ihrer Ansicht nach Modell implementieren müssen.

+0

Danke, Mike. Es war nur eine Frage des Aufrufs von 'OnPropertyChanged' auf 'Entity' anstatt seiner Eigenschaften. Ich dachte, dass, da die Bindungen auf den Entity-Eigenschaften sind, die 'OnPropertyChanged' für jede Eigenschaft anstelle des gesamten Objekts aufgerufen werden musste. Nun, viel einfacher. Danke noch einmal. – MurariAlex

Verwandte Themen