У меня есть два класса, которые ссылаются на третий:
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; }
...
}
Теперь я хотел бы отобразить оба 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>
Итак, разметкаотличается, за исключением TreeViewItem
, который отображает Named
класс.Я хотел бы повторно использовать разметку для этого TreeViewItem
.Слишком просто сделать из него UserControl
, но все же немного сложнее, чем показано в примере.Итак, я действительно хотел бы сделать что-то вроде этого:
<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>
А затем просто использовать это так:
<TreeView DataContext={Binding Path=Data1}>
<TreeView.Items>
<StaticResource ResourceKey="Named" />
</TreeView.Items>
</TreeView>
Как видите, имя свойства Data1
для Named
- Xxx
, а для Data2
имя свойства Named
- Yyy
.Итак, я должен передать это как-то на мой ресурс.Но как?
Например, как мне установить DataContext
этого StaticResource
поддерева на Xxx
для Data1
?
Что-то подобное не работает:
<StaticResource ResourceKey="Named" DataContext={Binding Path=Xxx} />
Извините за длинный вопрос.
Edit :
Все, что мне нужно, это кусок XAML, способный отображать экземпляр Named
.Итак, я хочу иметь возможность указать, где взять экземпляр (из Xxx
или Yyy
) вне этого фрагмента, чтобы я мог использовать его повторно.
Edit2 : вот решение с ControlTemplate
, однако оно не работает должным образом: TreeViewItem
становится недоступным для выбора.Что не так?
<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}" />
...