Entwickler-Ecke

WPF / Silverlight - Zugriff auf Elemente in ListBoxItems, die durch Templates er


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 user profile iconChristian S.: XML-Tags hinzugefügt
Moderiert von user profile iconChristian 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. - Mi 18.06.08 16:31

Content des Labels und DataContext (bzw. ItemsSource) der ComboBox würde ich über Bindings im Template lösen. Dafür sind DataTemplates ja auch irgendwo da ;-)


badboy0815 - Do 19.06.08 12:01

Natürlich werden ich solche Sachen dann über Bindings lösen. Aber dafür muss ich ja in der CodeBehind-Datei dem jeweiligen Element einen DataContext zuweisen können. Ganz wichtig z.b. bei den ComboBoxen - die brauchen ja ihren eigenen DataContext, damit die Elemente ordentlich dargestellt werden:

z.b. cb.DataContext = irgendwas;

...und das geht nur wenn ich Zugriff auf die Elemente habe und den bekomme ich nicht - das ist mein Problem.


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 { //wird in die Listbox gesteckt
    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>