Ich habe zwei Klassen, die die dritte Referenz:Wiederverwenden von Elementen und Datacontext
class Data1
{
public Named Xxx { get; set; }
public SomeClass1 Foo { get; set; }
...
}
class Data2
{
public Named Yyy { get; set; }
public SomeClass2 Bar { get; set; }
...
}
class Named
{
public string Name { get; set; }
...
}
Nun würde Ich mag beide angezeigt werden Data1
& Data2
:
<TreeView DataContext={Binding Path=Data1}>
<TreeView.Items>
<TreeViewItem>
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<ContentControl xml:space="preserve">Name: </ContentControl>
<ContentControl Content="{Binding Path=Xxx.Name}" />
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
<TreeViewItem><!-- somehow display Foo --></TreeViewItem>
<!-- More TreeViewItems, specific to Data1 -->
</TreeView.Items>
</TreeView>
<TreeView DataContext={Binding Path=Data2}>
<TreeView.Items>
<TreeViewItem>
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<ContentControl xml:space="preserve">Name: </ContentControl>
<ContentControl Content="{Binding Path=Yyy.Name}" />
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
<TreeViewItem><!-- somehow display Bar --></TreeViewItem>
<!-- More TreeViewItems, specific to Data2 -->
</TreeView.Items>
</TreeView>
So Markup ist anders, außer für TreeViewItem
, die Klasse anzeigt. Ich möchte Markup für diese TreeViewItem
wiederverwenden. Es ist zu einfach, UserControl
davon zu machen, aber es ist immer noch ein wenig komplizierter als im Beispiel gezeigt. Also, ich würde wirklich etwas zu tun:
<ResourceDictionary>
<TreeViewItem x:Key="Named">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<ContentControl xml:space="preserve">Name: </ContentControl>
<ContentControl Content="{Binding Path=Name}" />
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
</ResourceDictionary>
Und dann ist es wie folgt verwenden:
<TreeView DataContext={Binding Path=Data1}>
<TreeView.Items>
<StaticResource ResourceKey="Named" />
</TreeView.Items>
</TreeView>
Wie Sie sehen können, Data1
‚s Eigenschaftsname für Named
ist Xxx
, während Data2
's Eigentumsname für ist Yyy
. Also muss ich das irgendwie an meine Ressource weitergeben. Aber wie?
z. Wie setze ich die DataContext
dieses Teilbaums Xxx
für Data1
StaticResource
?
So etwas funktioniert nicht:
<StaticResource ResourceKey="Named" DataContext={Binding Path=Xxx} />
Sorry für die lange Frage.
bearbeiten:
Alles, was ich will, ist ein Stück von XAML, eine Named
Instanz darstellen kann. Also, ich möchte in der Lage sein, anzugeben, wo die Instanz (Xxx
oder Yyy
) außerhalb von diesem Stück zu bekommen, so dass ich es wiederverwenden kann.
EDIT2: hier ist die Lösung mit ControlTemplate
, aber es ist nicht gut funktioniert: die TreeViewItem
unselectable wird. Was ist los mit dir?
<ControlTemplate x:Key="Named" TargetType="TreeViewItem">
<TreeViewItem>
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name: " />
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
</ControlTemplate>
<!-- now use the template: -->
<TreeView>
<TreeView.Items>
<TreeViewItem Template="{StaticResource Named}"
DataContext="{Binding Path=Xxx}" />
...
Danke, Martin. Ich kenne "ItemsSource", aber in diesem Fall gibt es, wie Sie sehen, keine Sammlung, an die gebunden werden kann. – torvin