WPF ComboBox SelectedItem auf Null Gesetzt auf TabControl-Schalter
Ich habe ein einfaches problem, in meiner WPF-Anwendung, die hat mich schlug meinen Kopf auf den Tisch. Ich habe ein TabControl, wo jedes TabItem ist eine Ansicht generiert, die für ein ViewModel mit einem DataTemplate ähnlich wie diese:
<DataTemplate DataType="{x:Type vm:FooViewModel}">
<vw:FooView/>
</DataTemplate>
FooView enthält eine ComboBox:
<ComboBox ItemsSource="{Binding Path=BarList}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedBar}"/>
und FooViewModel enthält eine einfache Eigenschaft: public Bar SelectedBar { get; set; }
. Mein problem ist, dass wenn ich den Wert für meine ComboBox, wechseln Sie zu einer anderen Registerkarte wechseln Sie dann zurück, die ComboBox wieder leer. Wenn ich einen Haltepunkt auf die setter für mein Eigentum, sehe ich, dass die Eigenschaft zugeordnet ist null
wenn ich auf einen anderen Reiter wechseln.
Aus, was ich verstehe, wenn ein tab ausgeschaltet ist, wird es entfernt von der VisualTree - aber warum ist es meine Einstellung ViewModel-Eigenschaft auf null
? Das macht es für mich sehr schwer zu halten persistenten Zustand, und überprüfen value != null
scheint nicht wie die richtige Lösung. Kann jemand verschüttet etwas wie auf diese situation?
Edit: Den call-stack auf die setter-Haltepunkt zeigt nur [Externer Code] - keine Hinweise gibt.
InformationsquelleAutor der Frage bsg | 2010-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
wir liefen in das gleiche problem. Wir fanden ein blog-Eintrag beschreibt das problem. Wie es aussieht ist es ein bug in WPF und gibt es einen workaround:
Geben Sie die SelectedItem-Bindung vor die ItemsSource-Bindung und das problem sollte Weg sein.
Den link auf den blog-Artikel:
http://www.metanous.be/pharcyde/post/Bug-in-WPF-combobox-databinding.aspx
InformationsquelleAutor der Antwort Holger Adam
Meine app mit avalondock & prims und hatte genau das problem. Ich habe die gleichen Gedanken BSG, wenn wir umgeschaltet oder die Registerkarte Dokumentinhalt in MVVM-app, die Steuerelemente wie listview+box, Auswahlbox entfernt von der VisualTree. Ich nervte und sah die meisten Daten von Ihnen wurde auf null zurückgesetzt, wie itemssource selecteditem .. aber selectedboxitem war immer noch aktuellen Wert.
Einen Ansatz im Modell, überprüfen Sie deren Wert null ist dann wieder so:
Aber dieser Ansatz kann nur lösen, sehr gut in erste verbindliche Ebene. ich meine,
wie wir gehen, wenn Sie wollen, binden SelectedEmployee.Büro -, combobox -, tun dasselbe ist nicht gut
wenn der check-in propertyChanged-Ereignis der SelectedEmployee Modell.
Im Grunde, dass wir nicht wollen, ist sein Wert null zurückgesetzt werden, halten Sie Ihre pre-Wert. Ich habe eine neue Lösung gefunden
konsequent. Durch die Verwendung von angefügten Eigenschaft, die ich erstellt KeepSelection ein-Pro -, bool-Typ-Selektor steuert, so liefern alle Ihre ererbten saugen wie listview, combobox...
Finale, verwende ich diesen Ansatz einfach in xaml:
Aber selecteditem wird nie null, wenn Selektor itemssource-Elemente hat. Es kann beeinflussen
einige spezielle Kontext.
Hoffe, das hilft.
Glücklich conding! 😀
longsam
InformationsquelleAutor der Antwort longsam
In der Regel, ich benutze SelectedValue statt SelectedItem. Wenn ich das Objekt im Zusammenhang mit der SelectedValue dann füge ich ein lookup-Feld, das auf das Zielobjekt (da ich den Einsatz von T4-Vorlagen zu gen meine viewmodels, dies eher in einer partiellen Klasse). Wenn Sie eine nullable-Eigenschaft zu speichern, die SelectedValue-dann erleben Sie das oben beschriebene problem, jedoch wenn die Bindung des SelectedValue auf einen null-Wert (z.B. int), dann wird das WPF binding engine verwerfen der null-Wert als ungeeignet für die Zielgruppe.
InformationsquelleAutor der Antwort Peter H
Edit:
Unten funktioniert (hoffe ich...); ich habe es entwickelt, weil ich folgte dem
SelectedItems
route beschrieben, auf der MVVM-Lite Seite. Aber - warum will ich setzen aufSelectedItems
? Hinzufügen einesIsSelected
- Eigenschaft auf " meine Gegenstände (wie gezeigt hier) automatisch bewahrt die ausgewählten Elemente (kurz erwähnt cavet im obigen link). Am Ende, viel einfacher!Ursprünglichem Post:
ok - das war ein Stück Arbeit; ich habe einen mehrspaltigen ListView mit SelectionMode="Erweiterung", das macht die ganze Sache ziemlich Komplex. Mein Ausgangspunkt ist das tabItems von Arbeitsbereichen ähnlich wie beschreiben hier.
Machte ich sicher, dass in meinem ViewModel, ich weiß, wenn ein tab-Element (Arbeitsbereich) aktiv ist. (Das ist ein bisschen ähnlich wie hier) - natürlich, jemand muss initalize SelectedWorkspace ersten.
Dies erlaubte mir nach update das ViewModel nur ausgewählte Objekte, wenn die tab-Position (Arbeitsbereich) war tatsächlich aktiv. Daher mein ViewModel ausgewählte Elemente-Liste wird beibehalten, auch als Sie den Karteireiter löscht das ListView.SelectedItems. Im ViewModel:
Letzte, wenn das tabItem bekam wieder aktiviert, hakte ich bis zu dem 'Loaded' - Ereignis und restauriert die SelectedItems. Dies wird im code-behind der View. (Beachten Sie, dass während meiner ListView mehrere Spalten, einer dient als Schlüssel, die anderen sind nur zur information. die ViewModel-selectedItems list behält die Schlüssel. Sonst, im Vergleich unten wäre komplexer):
InformationsquelleAutor der Antwort Stefan_E
wenn Sie verklagt async Auswahl in WPF entfernen Sie Sie dann IsSynchronizedWithCurrentItem="True" aus der ComboBox, bitte Lesen Sie das Dokument über IsSynchronizedWithCurrentItem:
auch takecare die Bindung
zuerst verwenden Sie die SelectedItem
dann ItemsSource
ref:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/fb8a8ad2-83c1-43df-b3c9-61353979d3d7/comboboxselectedvalue-is-lost-when-itemssource-is-updated?forum=wpf
http://social.msdn.microsoft.com/Forums/en-US/c9e62ad7-926e-4612-8b0c-cc75fbd160fd/bug-in-wpf-combobox-data-binding
Ich mein problem lösen mit Hilfe der oben
InformationsquelleAutor der Antwort Surya
Ich hatte mal ein ähnliches problem. Es scheint, dass die combobox verliert das ausgewählte Element in VisibilityChanged Veranstaltung. Workarround ist, deaktivieren Sie die Bindung, bevor dies geschieht, und es zurücksetzen, wenn Sie wieder zurück kommen. Sie können auch versuchen, die Bindung an Mode=TwoWay
Hoffe, dass dies hilft
Jan
InformationsquelleAutor der Antwort JanW
Ich hatte das gleiche problem und löste es mit der folgenden Methode angebracht, um die Combobox DataContextChanged-Event:
Jedes mal also, wenn Sie wollen entfernen Sie die datacontext aus der combobox, werden die alten datacontext wird wieder gesetzt.
Jedes mal, wenn Sie ändern Sie den aktiven Tab von TabControl, die Combobox wird entfernt von Ihrem VisualTree und Hinzugefügt, wenn Sie gehen zurück auf die eins mit Ihrem combobox. Wenn die combo-box entfernt ist, von der VisualTree, auch den DataContext auf null gesetzt.
Oder Sie verwenden eine Klasse, die implementiert eine solche Funktion:
InformationsquelleAutor der Antwort Mitja
Ich denke, das problem kann sein, dass Sie nicht sagen, der Combo box, wenn Sie zu binden, zurück zu der Quelle. Versuchen Sie dies:
InformationsquelleAutor der Antwort Bryan
Ich hatte das gleiche problem beim scrollen durch eine Virtualisierung
DataGrid
enthältComboBox
es. MitIsSynchronizedWithCurrentItem
hat nicht funktioniert, noch hat das ändern der Reihenfolge derSelectedItem
undItemsSource
Bindungen. Aber hier ist ein hässlicher hack, das scheint zu funktionieren:Zuerst gebt Ihr
ComboBox
einex:Name
. Dies sollte in den XAML-Code für ein Steuerelement mit einem einzelnenComboBox
. Zum Beispiel:Dann fügen Sie diese beiden event-Handler in Ihrer codebehind:
InformationsquelleAutor der Antwort hypehuman
Können Sie das MVVM-framework Catel und die catel:TabControl-element gibt es dieses problem ist bereits gelöst.
InformationsquelleAutor der Antwort ruslan79k
Einfach nicht zulassen, dass Ihr ViewModel-Eigenschaft geändert werden, wenn Wert wird zu null.
Das ist es.
InformationsquelleAutor der Antwort Raimond Dumea