badboy0815 - Mi 18.06.08 14:55
Titel: Zugriff auf Elemente in ListBoxItems, die durch Templates er
Hallo,
ich habe das folgende Problem und hoffe, dass mir jemand weiterhelfen kann:
ich habe im XAML dieses DataTemplate erstellt, um die Elemente einer Listbox damit anzupassen:
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <DataTemplate x:Key="cbPropertyDock"> <DockPanel x:Name="db" Height="17"> <Label x:Name="lb" ></Label> <ComboBox x:Name="cb" > </ComboBox> </DockPanel> </DataTemplate> |
in der CodeBihind-Datei wähle ich nun dieses Template aus und weise es zu:
C#-Quelltext
1:
| PropertyListBox.ItemTemplate = (DataTemplate)FindResource("cbPropertyDock"); |
...bei jedem neu erzeugten ListBoxItem wird also dieses Template verwendet. Bis hierhin funktioniert das auch sehr gut.
Mein Problem ist jetzt, dass ich nicht ohne weiteres wieder auf die Elemente zugreifen kann, die durch das Template erzeugt wurden. Ich möchte aber beispielsweise dem Label einen neuen Content oder der Combobox einen DataContext zuweisen können.
Durch das Auslesen der Kindelemente über den VisualTreeHelper kann man zwar umständlich auf die Unterelemente zugreifen, aber das funktioniert scheinbar auch nur dann, wenn die die ListBoxItems in der ListBox schon fertig gerendert zur Verfügung stehen.
Es wäre also schön, wenn mir jemand eine Bessere Lösung für den Zugriff auf die Template-Elemente nennen könnte, bzw. eine Möglichkeit, wie ich das Rendern der Elemente in der ListBox per Hand anschubsen kann und so sicher gehen kann, dass sie auch für den VisualTreeHelper verfügbar sind.
Viel Dank
Moderiert von
Christian S.: XML-Tags hinzugefügt
Moderiert von
Christian S.: C#-Tags hinzugefügt
michlG - Mi 18.06.08 15:40
Hallo badboy0815,
Crosspost....
Aber da du ja einen Tag zwischen den Posts gewartet hast, ist das nicht so schlimm. Ich möchte nur darauf hinweisen, damit sich nicht Leute darüber den Kopf zerbrechen, obwohl die Lösung schon im anderen Forum ist.
LINK zu MyCSharp.de:
http://www.mycsharp.de/wbb2/thread.php?postid=309957
mfg
michael
Christian S. - Do 19.06.08 12:10
Den DataContext bekommt ein DataTemplate doch dadurch, dass man ein Objekt der Klasse X z.B. in eine Listbox packt. Benutzt die ListBox als ItemTemplate Dein DataTemplate, dann ist der DataContext Dein Objekt der Klasse X. Und der Rest ergibt sich dann, z.B. so:
C#-Quelltext
1: 2: 3: 4:
| class MyClass { public string Title {get; set;} public IEnumerable<String> SubItems {get;} } |
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <DataTemplate x:Key="cbPropertyDock"> <DockPanel x:Name="db" Height="17"> <Label x:Name="lb" Text="{Binding Path=Title}"></Label> <ComboBox x:Name="cb" ItemsSource="{Binding Path=SubItems}" > </ComboBox> </DockPanel> </DataTemplate> |