Entwickler-Ecke
WPF / Silverlight - ComboBox im DataTemplate einer ListBox
UGrohne - Di 29.05.12 19:38
Titel: ComboBox im DataTemplate einer ListBox
Irgendwie krieg ich das gerade mal wieder nicht hin:
Ich habe eine ObservableCollection mit Strings (AvailableStrings). Aus diesen soll der Benutzer eine Liste zusammen stellen können. Nun hab ich eine extra ObservableCollection SelectedStrings, die per Button erweiterbar ist. An diese Liste ist die ListBox gebunden. Der DataContext wurde auf die aktuelle Klasseninstanz festgelegt, damit ich direkt auf die Properties binden kann.
Im ItemTemplate der Listbox soll nun eine ComboBox die Werte aus Liste 1 zur Auswahl anbieten und den gewählten Wert in der zweiten Liste speichern.
Die ersten Schritte sind gemacht, aber die ComboBox speichert die Werte einfach nicht im aktuellen Element der Liste 2:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <ListBox Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ParentListBox" VerticalAlignment="Top" Width="177" ItemsSource="{Binding SelectedStrings}"> <ListBox.ItemTemplate> <DataTemplate> <ComboBox ItemsSource="{Binding ElementName=ParentListBox,Path=DataContext.AvailableStrings}" HorizontalAlignment="Stretch" SelectedItem="{Binding .,Mode=TwoWay}"> </ComboBox> </DataTemplate> </ListBox.ItemTemplate> </ListBox> |
Bin ich irgendwie blind? ;)
UGrohne - Di 29.05.12 21:33
Das versteh ich nun aber nicht ganz: Der DataContext jeder ComboBox wird doch auf jeweils ein Element der Collection AvailableStrings gesetzt, dann habe ich in . doch einen String, oder nicht?
Kha - Di 29.05.12 23:07
Ja. Aber was verändert folgender äquivalenter Code an der originalen Liste?
C#-Quelltext
1: 2: 3:
| List<string> SelectedStrings = ...; string DataContext = SelectedStrings[i]; DataContext = cbx.SelectedItem; |
Besser sieht es da mit einem Wrapper aus
C#-Quelltext
1: 2: 3:
| List<MutableWrapper<string>> SelectedStrings = ...; var DataContext = SelectedStrings[i]; DataContext.Value = cbx.SelectedItem; |
UGrohne - Mi 30.05.12 11:17
Ach, jetzt blick ichs, Du meinst Werte- und Referenztypen ... natürlich ... :autsch:
Probier ich heute Abend gleich mal.
Kha - Mi 30.05.12 12:41
Uh, ein Wertetyp sollte hier eigentlich nicht vorgekommen sein :mrgreen: .
UGrohne - Mi 30.05.12 12:44
Kha hat folgendes geschrieben : |
Uh, ein Wertetyp sollte hier eigentlich nicht vorgekommen sein :mrgreen: . |
Wenn ich das richtig verstanden habe schon: Ich binde an einen String, der wird in .NET wie ein Werttyp behandelt, ein neuer Speicherbereich wird erzeugt und verändert, der nichts mehr mit dem in der Collection referenzierten zu tun hat.
Ansonsten würde die Sache mit einer eigenen Klasse ja auch zu nichts anderen führen.
Kha - Mi 30.05.12 12:51
Was du meinst, ist Mutability/Immutability, was ich oben ja schon erwähnt habe. Structs implizieren aber weder Immutability noch anders herum (mutable Structs sind trotzdem böse und wären in diesem speziellen Fall auch keine Lösung).
UGrohne - Do 31.05.12 16:03
Kha hat folgendes geschrieben : |
Was du meinst, ist Mutability/Immutability, was ich oben ja schon erwähnt habe. Structs implizieren aber weder Immutability noch anders herum (mutable Structs sind trotzdem böse und wären in diesem speziellen Fall auch keine Lösung). |
OK, mit dem Thema hab ich mich noch nicht so beschäftigt, ich kann es mir mit dem Zeigerverhalten von .NET erklären, da wird das Szenario dann erklärbar. Jedenfalls war das Verpacken in eine "StringWrapper"-Klasse die Lösung für das Problem.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!