Wie bekomme ich eine ItemsSource, um ihre Bindung zu aktualisieren?

8

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.

    
Edward Tanguay 30.04.2009, 12:44
quelle

3 Antworten

12

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?

    
Denis Troller 30.04.2009, 12:55
quelle
7

Die Zeile unterhalb der Zeile funktioniert genauso wie beim Entfernen zum Hinzufügen eines Objekts in einer Sammlung:

%Vor%     
user2267032 10.04.2013 16:24
quelle
0

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.

    
Joe White 30.04.2009 12:52
quelle

Tags und Links