WPF数据模板ContentPresenter中的“Binding”

8
有人可以解释一下我在这里使用的代码是如何工作的吗?
<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可以展示正确的UserControl,而不需要引用不同的DataTemplates?我可以看到,ContentPresenter的内容绑定到我的ViewModels CurrentViewProperty,但我的DataTemplates没有绑定?
  • 另一个很棒的功能是,UserControls使用正确的ViewModels而无需声明。(或者在没有声明的情况下,我看不到声明)
我已经找到了这个描述http://msdn.microsoft.com/en-us/library/System.Windows.Controls.ContentPresenter(v=vs.110).aspx,但备注部分没有回答这些问题。(或者我没看到...)
再次强调,一切都工作得很完美,但我不明白为什么,所以这只是一个问题,以便理解模板选择和绑定。
2个回答

11

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

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


6
在您发布的链接的备注部分中,有这样一句话:“如果与内容类型关联的有DataTemplate,则ContentPresenter将该DataTemplate应用于Content属性,显示生成的UIElement及其任何子元素。” 此外,如果您想知道如何自动选择数据模板,可以在这里阅读:数据模板概述。引用链接中的一句话:“DataTemplate类具有DataType属性,非常类似于Style类的TargetType属性。 DataTemplate会自动应用于与底层类型相关联的所有对象。” 这类似于样式。如果您没有在样式上指定x:Key,则将自动将其应用于在定义资源的根元素下的所有子元素。一旦您在样式上设置了x:Key,它就不再是默认样式,并且仅适用于明确将样式设置为此资源的元素。
同样适用于 DataTemplate。当您仅指定 DataType 时,它成为表示底层数据类型的默认模板。显式指定 x:Key 将打破此功能。

谢谢您,我又重新阅读了MSDN的注释文章,你是正确的,现在语句很清楚了。 - Bador

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接