次のシナリオを理解したいだけです。 <TabControl>
にバインドされたObservableCollection<TabViewModel>
を実装している場合
データテンプレートなし
DataTemplate
sがない場合、テキストWpfApplication1.TabViewModel
がタブヘッダーとコンテンツに表示されます。 Ok私はこの部分を理解しています。
ちょうどItemTemplate
私がちょうど持っているとき
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding TabTitle}" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
次に、タブヘッダーがいっぱいになります。タブの内容はまだWpfApplication1.TabViewModel
です。
ちょうどDataTemplate
<Window.Resources>
に以下がある場合
<DataTemplate DataType="{x:Type local:TabViewModel}">
<TextBox Text="{Binding Text}" />
</DataTemplate>
そのテンプレートがタブヘッダーを埋めます。
両方
両方がある場合、ItemTemplate
はタブヘッダーを埋め、DataTemplate
はタブコンテンツを埋めます。なぜこのすべての違い。 ItemTemplate
&DataTemplate
は、もう一方が存在しない場合、タブヘッダーを埋めます。両方が存在する場合、ItemTemplate
がヘッダーを埋め、DataTemplate
がコンテンツを埋めます。
物事はうまくいきますが、かなり混乱しています。 <TabControl.HeaderTemplate>
のようなものがヘッダーを埋め、<TabControl.ItemTemplate>
がコンテンツを埋めるのではないでしょうか?
まず、2つのテンプレートがここに含まれています。
TabControl.ItemTemplate
、TabItem
ヘッダーのレンダリングに使用TabControl.ContentTemplate
、TabItem
コンテンツのレンダリングに使用これらのプロパティを明示的に設定しない場合、WPFは他の場所でそれらを解決しようとします。論理ツリーを上に移動して、ビューモデルのレンダリング方法を伝えるリソースを探します。一致するDataTemplate
があるがキーがないDataType
が見つかった場合、それを使用してビューモデルをレンダリングします。見つからない場合は、デフォルトでオブジェクトのToString
値がレンダリングされます。
したがって、明示的にしたい場合は、次のようなものが必要です。
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabTitle}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
あなたは具体的ではないので、WPFは論理ツリーをたどって適切なDataTemplate
を見つけようとします。それが見つかると、それを使用してビューモデルをレンダリングします。見つからない場合は、ToString
を呼び出してレンダリングします。
したがって、特定のケースに対処するには:
Just ItemTemplate
タブヘッダーをレンダリングする方法を明示的に説明しましたが、タブコンテンツはレンダリングしません。したがって、前者は提供されたDataTemplate
を使用してレンダリングされますが、後者はデフォルトでToString
になります。
Just DataTemplate
タブヘッダーまたはタブコンテンツのレンダリング方法を明示的に指定していません。したがって、WPFは両方に対して適切なDataTemplate
を検索します。どちらにもビューモデルのインスタンス(つまりDataContext
)が含まれているため、同じDataTemplate
がタブヘッダーとそのコンテンツのレンダリングに使用されます。
注:これがあなたの質問で起こっていることであると明示的に述べていませんでした。私が間違っている場合は私を訂正してください。
両方
この場合、タブのヘッダーではなくタブのコンテンツをレンダリングする方法を明示的に説明しました。したがって、タブヘッダーには明示的なDataTemplate
が使用され、タブの内容には暗黙的なDataTemplate
が使用されます。