Laden...

ObservableCollection und Collectionview für Combobox

Erstellt von User16331 vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.979 Views
U
User16331 Themenstarter:in
36 Beiträge seit 2009
vor 13 Jahren
ObservableCollection und Collectionview für Combobox

Hallo,

ich möchte in einer Combobox per ItemsSource-Property einige Einträge anzeigen lassen, die in der view sortiert dargestellt werden sollen. Im ViewModel gibt es dafür eine ObservableCollection

private readonly ObservableCollection<Info> _infos= new ObservableCollection<Info>();
public ObservableCollection<Info> Infos { get { return this._infos; } }

Die ObservableCollection wird einmal instanziiert und gelegentlich kommen neue Einträge dazu oder ein paar alte werden rausgelöscht. Die view soll die ComboBox entsprechend updaten und stets sortiert halten. Der Code dazu:

 <UserControl.Resources>
        <CollectionViewSource 
            x:Key="infos"
            Source="{Binding Path=Infos}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Name" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
</UserControl.Resources>

und

<editors:XamComboEditor ItemsSource="{Binding Source={StaticResource ResourceKey=infos}}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedInfo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Es funktioniert auch alles wunderbar ("Also, was ist dann das Problem?"), aber ich habe im Netz an einigen Stellen Beispiele gefunden, die mit Code-Behind Update-Funktionalität einbringen, da sich angeblich der CollectionView nicht aktualisiert, wenn das CollectionChanged-Event der ObservableCollection ausgelöst wird, also wenn Einträge dazukommen oder rausfallen. Wie ist da der augenblickliche Stand? Kann ich alle Stellen in meinem Code auf diesen Mechanismus umstellen oder wird das vermutlich nicht funktionieren und ich muss im ViewModel selbst sortieren? Wie gesagt, in meinem Beispiel funktioniert es ja und ich wundere ich über Aussagen, dass das bei ObservableCollections nicht 'live' aktualisiert wird.

Vielen Dank im Voraus!

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Cupid,

wir greifst du auf die ObservableCollection zu? Wenn du über __infos _zugreifst, aktualisiert sich zwar die ObservableCollection, aber nicht die UI. Greif auf die _Infos _zu, da du auch an diese dran bindest.

zero_x

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

Wenn du über __infos _zugreifst, aktualisiert sich zwar die ObservableCollection, aber nicht die UI. Greif auf die _Infos _zu, da du auch an diese dran bindest.

Wieso? Das ist genau das selbe Objekt, nur durch ein Property nach außen gegeben. Das macht keinen Unterschied ob man im Code jetzt auf das Feld oder das Property zugreift.

Es geht ja nicht darum das Collection Objekt zu ersetzen (dann würds nen Unterschied machen) sondern nur den Inhalt des Objekts zu ändern.

Ich seh bei dem Vorgehen keine Probleme. Ist das übliche Vorgehen. Sehe auch keinen Grund wieso das was nicht aktualisiert werden sollte. Ne CollectionView ist eh immer dazwischen beim Binding. Du hast sie nur explizit definiert, statt einer impliziert definierten.

Baka wa shinanakya naoranai.

Mein XING Profil.

U
User16331 Themenstarter:in
36 Beiträge seit 2009
vor 13 Jahren

Hi!

Vielen Dank für Eure Antworten!

@zero_x
Wenn ich im ViewModel die Liste verändere, also irgendetwas tue, das das CollectionChanged-Event auslöst, dann kann ich das doch trotzdem über das Public-Property machen. Nur wenn ich die Liste selbst setzen will, müsste ich dadurch, dass ich nur das private-Property schreiben kann, eben dieses setzen. Dadurch würde kein PropertyChanged für das Collection-Property ausgelöst. Damit kein Entwickler versehentlich auf diese Idee kommt, die Collection neu zuweisen zu wollen, ist das private Property als readonly deklariert.

@talla
Danke, es freut mich das zu hören. Schade, dass ich erst so spät lerne, wie leicht man Listen sortieren kann. Das hätte mir einiges an C#-Code gespart, der blöderweise auch noch view-spezifisch ist, aber bei mir im ViewModel rumlungert. Jetzt kann ich diesen kleinen Schönheitsfehler beseitigen. Ich muss mich noch schlaumachen, was die CollectionViews alles leisten können. Da scheint es ja reichlich Möglichkeiten zu geben...

Danke nochmal!