WPF: Ersetzen der Daten der datengebundenen Sammlung ohne Clear / Add

8

Wenn ich WPF-Datenbindung verwende, kann ich offensichtlich nicht in der Art von MyCollection = new CollectionType<Whatever>( WhateverQuery() ); etwas tun, da die Bindungen einen Verweis auf die alte Sammlung haben. Mein bisheriger Workaround war MyCollection.Clear(); , gefolgt von foreach doing MyCollection.Add(item); - was sowohl für die Performance als auch für die Ästhetik ziemlich schlecht ist.

ICollectionView , obwohl ziemlich ordentlich, löst das Problem auch nicht, da es SourceCollection -Eigenschaft schreibgeschützt ist; Schade, denn das wäre eine schöne und einfache Lösung gewesen.

Wie gehen andere Leute mit diesem Problem um? Es sollte erwähnt werden, dass ich MVVM mache und somit nicht durch einzelne Steuerbindungen stöbern kann. Ich nehme an, ich könnte einen Wrapper um ObservableCollection sporting eine ReplaceSourceCollection() -Methode erstellen, aber bevor ich diesen Weg gehe, würde ich gerne wissen, ob es andere Best Practices gibt.

BEARBEITEN:

Für WinForms würde ich die Steuerelemente an ein BindingSource binden, was mir erlaubt, einfach seine DataSource -Eigenschaft zu aktualisieren und die ResetBindings() -Methode aufzurufen - presto, die zugrunde liegende Sammlung wird effizient geändert. Ich hätte erwartet, dass WPF Databinding ein ähnliches Szenario aus der Box unterstützen würde?

Beispielcode (pseudo-ish): Das WPF-Steuerelement (ListBox, DataGrid, was immer Sie wollen) ist an die Eigenschaft Users gebunden. Ich weiß, dass Sammlungen schreibgeschützt sein sollten, um die Probleme von ReloadUsersBad() zu vermeiden, aber dann würde der schlechte Code für dieses Beispiel offensichtlich nicht kompilieren:)

%Vor%     
snemarch 29.11.2010, 10:43
quelle

2 Antworten

4

Wenn das Objekt MyCollection von implements INotifyPropertyChanged ist, können Sie die Sammlung einfach ersetzen.

Ein Beispiel:

%Vor%

Damit erkennt WPF, wenn Sie eine Sammlung zuweisen, dies und alles wird aktualisiert.

So würde ich das lösen.

    
Pieter van Ginkel 29.11.2010, 11:21
quelle
1

Der folgende Link erläutert, wie eine AddRange-Methode implementiert wird.

Ссылка

Es sieht so aus, als ob Sie bei der Implementierung einer Unterklasse, die diesen Fall korrekt behandelt, feststecken.

Offensichtlich unterstützen bestimmte Steuerelemente keine Änderungsbenachrichtigungen für stapelweise Sammlung. Zumindest haben sie nicht, als dieser Artikel geschrieben wurde. Obwohl jetzt sollten Sie ein bisschen mehr Informationen haben, wenn Sie weiter untersuchen möchten.

    
Josh Smeaton 29.11.2010 11:16
quelle

Tags und Links