Autor Beitrag
badboy0815
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 18.06.08 14:55 
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:

ausblenden 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:

ausblenden 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
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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: www.mycsharp.de/wbb2...ad.php?postid=309957

mfg
michael
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
badboy0815 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
class MyClass { //wird in die Listbox gesteckt
    public string Title {get; set;}
    public IEnumerable<String> SubItems {get;}
}


ausblenden 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>

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".