У меня есть два класса, которые ссылаются на третий:Повторное использование элементов и 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; }
...
}
Теперь, я хотел бы показать, как 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
«s для Named
является Xxx
, в то время как Data2
's property name for Named
является Yyy
. Итак, я должен передать это как-то моему ресурсу. Но как?
E.g. как мне установить 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}" />
...
Спасибо, Мартин. Я знаю «ItemsSource», однако в этом случае, как вы можете видеть, нет привязки к коллекции. – torvin