6

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 对象的类型相同(或基类)。如果找到,它将使用该模板来呈现选项卡项的 Content 属性引用的 ViewModel 对象。

我的问题是:

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

4

2 回答 2

4

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

于 2013-06-07T08:09:42.683 回答
4

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

因为您已经明确设置了模板,所以预期的类型是什么并不重要:它会尝试Content使用您设置的模板显示您中的任何对象 - 如果您使用的类型不不匹配!

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

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

这是在整个应用程序中进行一致的数据表示的有用方法,因为类型化DataTemplate将被整个应用程序中的任何内容呈现控件自动使用。

于 2013-06-07T08:13:29.707 回答