CollectionView.Refresh
-
Hi.
Um die Combobox in meiner View zu aktualisieren rufe ich im ViewModel einen Refresh auf die DefaultView der gebundenen ObservableColletion:
CollectionViewSource.GetDefaultView(Units).Refresh();
Das Problem hierbei ist dass die Elemente der Liste zwar aktualisiert werden das slektierte Element allerdings nicht.
Wie aktualisiere ich das Selektierte Item?
-
Kommt drauf an, was genau willst du aktuallisieren am Selektierten Objekt?
Zum einen gibt es das das SelectedItem, welches gebunden wird, sowie die Eigenschaft "IsSynchronizedWithCurrentItem" die automatisch das selectierte Element an die Eigenschaft CurrentItem vom System.ComponentModel.ICollectionView setzt.
Mfg mdn
-
Ich möchte das selektierte Element gar nicht ändern sondern nur neu anzeigen.
Also um etwas genauer zu werden.
Die Elemente werden über eine Textbox dargestellet definiert in Itemtemplate.
Die Angezeigten werden laufen aber über einen Converter.Dieser Converter greift aber zusätlich auf einen Wert zu der Variable ist.
Wird nun dieser Wert geändert möchte ich das die Combobox ihre Werte neu anzeigt.
Rufe ich CollectionViewSource.GetDefaultView(Units).Refresh(); auf werden alle Elemente in der Combobox neu dargestellt. Das heißt der Converter wird erneut durchlaufen. Das selkierte Element wird zwar auch aktualisiert. Aber nur das in der Liste nicht das Element das in der Combobox angezeigt wird wenn diese geschlossen ist.
-
aah jetzt glaub ich habe ich dein Problem verstanden. Ich glaube aber du gehst an dieser Stelle von falschen Informationen aus.
Und zwar dein Refresh() auf der Liste, sagt nur das die Anordnung innerhalb der Liste sich verändert hat, aber es sagt der Oberfläche nicht, das sich Werte innerhalb der Objekte verändert haben. Dafür müsstest du an der Klasse der Objekte die Schnittstelle INotifyPropertyChanged implementieren und an der passenden Eigenschaft das Event werfen.
Oder du musst der Oberfläche mitteilen, dass sich die Selektion verändert hat, damit die TextBox eine Änderung auf dem DataContext mitbekommt und die Werte erneut holt. Dies könntest du wie folgt erreichen (es muss aber IsSynchronizedWithCurrentItem="true" an der ComboBox aktiv sein):
var collectionView = CollectionViewSource.GetDefaultView(Units); var oldSelectedObj = collectionView.CurrentItem; collectionView.MoveCurrentTo(null); collectionView.MoveCurrentTo(oldSelectedObj);
Bzw. wie ist deine TextBox an dem selektierten Element der ComboBox angehängt?
Mfg mdn
-
Nicht gut die selektion zu verändern.
Egal Problem gelöst. Multibinding ist das Stichwort. Danke