我对以下代码示例的工作原理感到非常困惑。似乎Contentcontrol从窗口资源获取datatemplate。
内容控件是否有自己的“contenttemplate”来确定其中的视图?如果没有设置任何内容,它是否只是向上搜索并将其内容设置为datatemplate?
我可能会混淆这两个术语,但我真的很困惑为什么该示例将datatemplate存储在窗口资源级别。
无论如何,我试图了解为给定Window设置视图的选项。最初我只是使用contentcontrol并在其中托管视图,但后来我想知道是否可能有一个理由让contentcontrol选择一个Page(来自实际的页面类)而不是一个视图(扩展用户)控制)。
<Window.Resources>
<DataTemplate DataType="{x:Type local:HomeViewModel}">
<local:HomeView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ProductsViewModel}">
<local:ProductsView />
</DataTemplate>
</Window.Resources>
<DockPanel>
<Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding PageViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<ContentControl Content="{Binding CurrentPageViewModel}" />
</DockPanel>
答案 0 :(得分:3)
由于DataType
属性,它起作用。如果DataTemplate指定DataType(没有Key),则运行时将该类型的对象与模板匹配。
没有内容控件有自己的&#34; contenttemplate&#34;应该确定它中的视图?
确实如此,但是如果它没有设置ContentTemplate
属性,那么运行时看起来应用与该类型匹配的DataTemplate。 MSDN文档在TargetType
元素上类似于Style
- 您可以在本地应用样式,但您也可以将样式全局应用于某种类型。例如,使用<Style TargetType="{x:Type Button}">
将该样式应用于作用域中的所有按钮。同样,<DataTemplate DataType="{x:Type local:HomeViewModel}">
将该模板应用于类型为&#34; HomeViewModel&#34;的所有内容。
如果没有设置任何内容,它是否只是向上搜索并将其内容设置为datatemplate?
排序,是的。它搜索当前资源,其中包括从父资源字典继承的资源密钥。
我可能会混淆这两个术语,但我真的很困惑为什么该示例将datatemplate存储在窗口资源级别。
它并不重要 - 您可以将它们存储在应用程序级别,甚至是ContentControl
内部。