Ich habe eine Ansicht, die eine Listbox anzeigt, die an GetAll () gebunden ist:
%Vor%GetAll () ist eine ObservableCollection-Eigenschaft in meinem ViewModel:
%Vor%wiederum ruft eine GetAll () - Modellmethode auf, die eine XML-Datei liest, um die ObservableCollection zu füllen.:
%Vor%Das funktioniert alles, außer wenn der Benutzer zu einer anderen Ansicht wechselt, die XML-Datei bearbeitet und zu dieser Ansicht zurückkehrt, wobei die alten Daten immer noch anzeigen
Wie kann ich diese Ansicht dazu veranlassen, "ihre Bindungen zu aktualisieren", so dass sie die tatsächlichen Daten anzeigt.
Es fühlt sich an, als würde ich WPF mit zu viel HTML / HTTP-Metapher ausführen. Ich habe den Eindruck, dass ObservableCollection eine natürlichere Methode ist, um sich selbst zu aktualisieren, daher der Name, aber dies ist die einzige Möglichkeit Der Benutzer kann zur Zeit Daten in einer WPF-Anwendung bearbeiten. So wird Hilfe auf jeder Ebene hier geschätzt.
Ein ItemsControl
fordert seine Bindung einmal an und speichert die Referenz danach.
Wenn der Inhalt des Sammlungsobjekts geändert wird und INotifyCollectionChanged
(wie ObservableCollection
) implementiert wird, werden alle hinzugefügten oder entfernten Objekte übernommen.
Wenn nun die Bindung ein neues Auflistungsobjekt für ListBox
bereitstellen soll, können Sie Ihr Ansichtsmodell INotifyPropertyChanged
implementieren und PropertyChanged
erhöhen, wobei GetAll
als Eigenschaftsname übergeben wird.
Dies hat den Effekt, dass die Bindung, dass sich der Wert der Eigenschaft geändert hat, (es gibt eine neue ObservableCollection
, die bereit ist abgeholt zu werden) vor der ListBox
gewarnt wird, die ihre Items neu generiert.
Solange Sie Änderungen an Ihrer App vornehmen und an ObservableCollection
arbeiten, das von GetAll
zurückgegeben wurde, können Sie hinzufügen und entfernen und die Liste bleibt synchron. Wenn Sie externe Änderungen aufnehmen möchten (Sie haben möglicherweise eine Aktualisierungsschaltfläche oder einen natürlichen Punkt, an dem es sinnvoll ist, die gesamte Datei neu zu laden), können Sie Ihr View-Modell das PropertyChanged
-Ereignis auslösen lassen, das automatisch aufgerufen wird der Eigenschaften-Getter, der die statische Methode aufruft, die eine neue neue Sammlung zurückgibt.
Nitpicker Hinweis: Warum geben Sie Methodennamen zu Eigenschaften?
Die Zeile unterhalb der Zeile funktioniert genauso wie beim Entfernen zum Hinzufügen eines Objekts in einer Sammlung:
%Vor% Behalten Sie einen Verweis auf Ihre ObservableCollection
und die zuletzt geänderte Zeit der XML-Datei zum Zeitpunkt des Ladens. Wenn das Fenster den Fokus erhält, überprüfen Sie den Zeitstempel in der Datei. Wenn es geändert wird, löschen Sie das ObservableCollection
und füllen Sie es erneut aus. Die GUI lauscht automatisch auf Änderungsereignisse von ObservableCollection
und wird automatisch neu gefüllt, wenn Sie den Inhalt der Sammlung ändern.