私は三分の一を参照する2つのクラス、持っている:今再利用要素と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>
ので、マークアップを除いて、異なっていますNamed
クラスを表示するTreeViewItem
の場合この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>
あなたが見ることができるように、Named
ためData1
のプロパティ名はしばらくの間、Xxx
ですNamed
のData2
のプロパティ名はYyy
です。だから、私は何とか私のリソースにそれを渡す必要があります。しかしどうですか?
など。このStaticResource
サブツリーのDataContext
をXxx
のData1
に設定するにはどうすればよいですか?このような
何かが動作しません:長い質問の
<StaticResource ResourceKey="Named" DataContext={Binding Path=Xxx} />
申し訳ありません。
編集:
私が欲しいのはNamed
インスタンスを表示することが可能なXAMLの作品です。だから、インスタンスを取得する場所(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