2014-03-19 164 views
7

有人可以解释我在这里使用的代码是如何工作的吗?WPF DataTemplate ContentPresenter“绑定”

<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?我可以看到,ContentPresenter内容绑定到ViewModels的CurrentViewProperty,但我的DataTemplates不是?
  • 另一个很棒的功能是UserControls使用正确的ViewModels而不需要声明。 (或没有我可以看到的声明)

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

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

回答

9

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

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

+0

现在我明白了,非常感谢你! – Bador

5

下的链接的备注栏您发布它的这种说法不够明确:

如果没有与内容类型相关联的一个DataTemplate中, ContentPresenter应用于的DataTemplate中的内容属性和 显示结果UIElement及其子元素(如果有)。

此外,如果你想知道如何自动选择dataTemplates,你可以在这里阅读 - Data Templating Overview。从链接

报价:

的DataTemplate中类有一个数据类型属性,这是非常相似的 Style类的TargetType的属性。 DataTemplate自动应用 到所有与基础类型关联的对象。

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

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

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

+0

谢谢您,我已经通读了MSDN备注文章,您的权利现在已清楚。 – Bador