WPF如何设置contentcontrol的datatemplates?

时间:2014-12-16 21:21:34

标签: wpf xaml mvvm navigation

我对以下代码示例的工作原理感到非常困惑。似乎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>

1 个答案:

答案 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内部。