Josh Smith MVVM演示应用

时间:2013-06-07 07:57:52

标签: c# mvvm datatemplate

MainWindow 中,我们有:

 <HeaderedContentControl 
          Content="{Binding Path=Workspaces}"
          ContentTemplate="{StaticResource WorkspacesTemplate}"
          Header="Workspaces"
          Style="{StaticResource MainHCCStyle}"
          />

资源

  <DataTemplate x:Key="WorkspacesTemplate">
    <TabControl 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource ClosableTabItemTemplate}"
      Margin="4"
      />
  </DataTemplate>

文章中说:

  

类型化的DataTemplate没有分配给它的x:Key值,但是   它的DataType属性设置为Type的实例   类。 如果WPF尝试渲染一个ViewModel对象,它将会   检查资源系统是否在范围内具有类型化的DataTemplate   其DataType与您的类型(或基类)相同   ViewModel对象。如果找到一个,它会使用该模板来渲染   选项卡项的内容属性引用的ViewModel对象。

我的问题是:

模板如何知道类型是工作空间的集合(WorkspaceViewModel)?

2 个答案:

答案 0 :(得分:4)

WPF并不真正关心具体类型,它只需要一些IEnumerable的东西,WPF使用类型描述符来知道ui绑定的内容。

答案 1 :(得分:4)

在您发布的代码中不需要。在您的示例中,您为内容模板赋予了严格的价值:您已明确使用{StaticResource WorkspacesTemplate},因此会查找密钥为"WorkspacesTemplate的资源。

因为您已经明确设置了模板,所以预期的类型无关紧要:它会尝试使用您设置的模板显示Content中的任何对象 - 具有不同程度的如果你使用不匹配的类型会成功!

在您提到的替代方法中 - 使用“typed DataTemplate”,您将使用<DataTemplate DataType="{x:Type l:WorkSpace}" />声明您的datatemplate。请注意,没有x:Key(并且我还假设您有一个名称空间l映射到您的本地代码)。这里发生的是WPF自动将资源的密钥设置为DataType(重要的是要注意:资源密钥不必是字符串!)。

然后,当您声明HeaderedContentControl时,您可以省略设置ContentTemplate。在运行时,当呈现控件时,WPF将检查Content对象的类型并发现它是WorkSpace,然后它将查找具有x:Key="{x:Type l:WorkSpace}"的资源 - 将匹配您键入的模板。

这是在整个应用程序中对数据进行一致表示的有用方法,因为在整个应用程序中,任何内容呈现控件都会自动使用键入的DataTemplate