ListBox-Element wurde nicht aktualisiert, wenn sich die Eigenschaft geändert hat

7

Ich habe Probleme beim Aktualisieren von Listbox mit ObservableCollection, wenn sich die Eigenschaft der Sammlung ändert (das Hinzufügen / Entfernen von Elementen aus der Liste funktioniert einwandfrei):

listbox hat ItemsSource="{Binding Path=AllPerson}" gesetzt und der Datenkontext im Code ist wie folgt gesetzt: this.DataContext = allPersonClass; .

allPersonClass enthält ObservableCollection<Person> allPerson

Die Klasse Person enthält Eigenschaften wie Name usw.

Ich habe die Methode ToString der Person überschrieben, um Name -Eigenschaft zurückzugeben, damit listBox gültige Daten anzeigt

Ich habe versucht, Person implementieren INotifyPropertyChanged

zu machen %Vor%

und in jedem Property Setter hat onPropertyChanged(this, "propertyName"); , das ausgeführt wird, aber listBox aktualisiert nie bereits erstelltes Element

Irgendeine Idee, was könnte falsch sein?

hier ist ein Fenster mit listBox xaml

%Vor%

Dies ist Teil des DetailView-Fensters, in dem Änderungen vorgenommen werden (an Person gebunden)

%Vor%

Hier ist Teil AllPersonClass:

%Vor%

BEARBEITEN

Hier ist ein relevanter Teil der Methode zum Speichern von Änderungen in der Detailansicht

%Vor%

Beachten Sie, dass Änderungen in "ObservableCollection allPerson" vorgenommen werden. Nur listBox zeigt weiterhin alte Daten an

    
Abdul 13.03.2013, 21:26
quelle

4 Antworten

10

Wenn Sie möchten, dass die Benutzeroberfläche aktualisiert wird, wenn Sie Änderungen an den Eigenschaften von Personen vornehmen, müssen Sie angeben, dass diese Eigenschaft geändert wurde, nicht die Klasse

%Vor%

Sollte

sein %Vor%

Und Sie müssen ToString() nicht für das Person -Modell überschreiben, damit es in Ihrem ListBox korrekt angezeigt wird. Sie können ListBox DisplayMemberPath so einstellen, dass die gewünschte Eigenschaft in ListBox %Vor%

Bearbeiten: Um Ihre Kommentarfrage zu beantworten:

%Vor%     
sa_ddam213 13.03.2013, 22:07
quelle
5

In Ihrer Detailansicht müssen Sie eine TwoWay-Bindung definieren, um den Eigenschaftsnamen Ihrer person -Klasse zu aktualisieren.

%Vor%

Auch wenn Sie die Eigenschaft jedes Mal aktualisieren möchten, wenn Text geschrieben wird, müssen Sie auch UpdateSourceTrigger mit PropertyChanged definieren. Andernfalls wird die Eigenschaft nur aktualisiert, wenn die TextBox den Fokus verliert.

%Vor%     
Jehof 13.03.2013 21:55
quelle
4

Ihr Problem besteht darin, dass Ihre Sammlung niemals über Ihr PropertyChanged

benachrichtigt wird

das sollte dir helfen

%Vor%

Siehe auch Link

    
WiiMaxx 14.03.2013 09:01
quelle
3

Ich denke, Sie möchten vielleicht überprüfen, wie Sie die Bindung auf Artikelebene durchführen. Schauen Sie sich diesen Link an, es wird Ihnen helfen:

Bestimmen, ob eine Zeile in ObservableCollection & lt; T & gt; tatsächlich geändert

    
code4life 13.03.2013 21:40
quelle