WPF DataTemplate ContentPresenter" Binding"

时间:2014-03-19 11:24:22

标签: wpf datatemplate

有人可以解释一下我在这里使用的代码是如何工作的吗?

<Window.Resources>
    <DataTemplate DataType="{x:Type VM:PBRKEntryViewModel}">
        <V:Overview  />
    </DataTemplate>
    <DataTemplate DataType="{x:Type VM:LoginViewModel}">
        <V:LoginView />
    </DataTemplate>
</Window.Resources>
<Grid>
    <ContentPresenter Content="{Binding CurrentView}"/>
</Grid>       

我目前在细节方面遇到的问题是:

  • 为什么ContentPresenter可以在不引用不同DataTemplates的情况下呈现正确的UserControl?我可以看到,ContentPresenter内容绑定到我的ViewModels CurrentViewProperty,但我的DataTemplates没有?
  • 另一个很棒的功能是UserControls使用正确的ViewModels而没有声明。 (或者我没看到声明)

我找到了这个说明http://msdn.microsoft.com/en-us/library/System.Windows.Controls.ContentPresenter(v=vs.110).aspx,但备注部分对此问题没有答案。 (或者我看不到他们......)

再次,为了清楚起见,一切都很完美,但我不明白为什么,所以这只是一个理解选择模板和绑定的问题。

2 个答案:

答案 0 :(得分:11)

指定DataType属性的DateTemplates将自动应用于视图中该类型的任何实例。这只是告诉WPF“每次需要显示此类型时,使用此模板”的方法

您的ContentPresenterContent绑定到某个对象。如果该对象类型具有匹配的模板,则WPF将使用它。

答案 1 :(得分:6)

在链接的备注部分,您发布的内容非常清楚:

  

如果存在与内容类型相关联的DataTemplate,则   ContentPresenter将DataTemplate应用于Content属性和   显示生成的UIElement及其子元素(如果有)。

此外,如果您想知道如何自动选择dataTemplates,您可以在此处阅读 - Data Templating Overview

从链接引用:

  

DataTemplate类具有与之非常相似的DataType属性   Style类的TargetType属性。 DataTemplate得到应用   自动到与基础类型相关联的所有对象。

类似于样式。如果您没有在样式上指定任何x:Key,它将自动应用于属于定义资源的根元素下的所有子元素。

只要在Style上设置x:Key,它就不再是默认样式,只会应用于显式设置此资源样式的元素。

同样适用于DataTemplate。仅指定DataType时,它将成为表示基础数据类型的默认模板。明确指定x:Key会破坏此功能。