Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 29.05.12 19:38 
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:
ausblenden 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? ;)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 29.05.12 21:21 
Ein Two-Way-Binding an . kann genauso wenig funktionieren wie eine Zuweisung an this ;) . Das muss auf eine Property zielen, also solltest du deine Strings in eine mutable Dummy-Klasse wrappen, siehe z.B. hier, da hatten wir quasi das gleiche Problem.

_________________
>λ=
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 29.05.12 21:33 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Ein Two-Way-Binding an . kann genauso wenig funktionieren wie eine Zuweisung an this ;) . Das muss auf eine Property zielen, also solltest du deine Strings in eine mutable Dummy-Klasse wrappen, siehe z.B. hier, da hatten wir quasi das gleiche Problem.

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 29.05.12 23:07 
Ja. Aber was verändert folgender äquivalenter Code an der originalen Liste?
ausblenden C#-Quelltext
1:
2:
3:
List<string> SelectedStrings = ...;
string DataContext = SelectedStrings[i];
DataContext = cbx.SelectedItem;


Besser sieht es da mit einem Wrapper aus
ausblenden C#-Quelltext
1:
2:
3:
List<MutableWrapper<string>> SelectedStrings = ...;
var DataContext = SelectedStrings[i];
DataContext.Value = cbx.SelectedItem; // SelectedItem="{Binding Value}"

_________________
>λ=
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 30.05.12 12:41 
Uh, ein Wertetyp sollte hier eigentlich nicht vorgekommen sein :mrgreen: .

_________________
>λ=
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 30.05.12 12:44 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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).

_________________
>λ=

Für diesen Beitrag haben gedankt: UGrohne
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 31.05.12 16:03 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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!