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.
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? –