WPF DataTemplate ContentPresenter"绑定"

Bad*_*dor 8 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>       
Run Code Online (Sandbox Code Playgroud)

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

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

我已经找到了这个描述http://msdn.microsoft.com/en-us/library/System.Windows.Controls.ContentPresenter(v=vs.110).aspx但是备注部分没有回答这个问题.(或者我看不到他们......)

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

Gaz*_*yer 11

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

ContentPresenterContent一些对象的约束.如果该对象类型具有匹配的模板,则WPF将使用它.


Roh*_*ats 6

在你发布的链接的备注部分,这个声明很清楚:

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

此外,如果您想知道如何自动选择dataTemplates,您可以在此处阅读 - 数据模板概述.

从链接引用:

DataTemplate类具有DataType属性,该属性与Style类的TargetType属性非常相似.DataTemplate会自动应用于与基础类型关联的所有对象.

与Styles类似.如果未x:Key在Style上指定任何内容,则它将自动应用于属于定义资源的根元素下的所有子元素.

一旦设置x:Key了Style,它就不再是默认样式,只会应用于显式设置此资源样式的元素.

同样适用于此DataTemplate.当您指定DataType只,成为默认的模板来表示基本数据类型.明确指定x:Key将破坏此功能.