乔什·史密斯 MVVM 演示应用程序



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>

并在文章中说:

类型化的数据模板没有分配 x:Key 值,但 它确实将其数据类型属性设置为类型的实例 如果 WPF 尝试呈现您的某个 ViewModel 对象,它将 检查资源系统在作用域中是否具有类型化数据模板 其数据类型与 视图模型对象。如果找到一个,它将使用该模板来呈现 选项卡项的"内容"属性引用的视图模型对象。

我的问题是

模板如何知道类型是工作区的集合 (工作区视图模型(?

它不需要,在你发布的代码中。 在您的示例中,您为内容模板指定了一个严格的值:您显式使用了 {StaticResource WorkspacesTemplate} ,因此将查找键为 "WorkspacesTemplate 的资源。

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

在您提到的替代方法 - 使用"类型化数据模板"时,您将使用 <DataTemplate DataType="{x:Type l:WorkSpace}" /> 声明您的数据模板。 请注意,没有x:Key(而且我假设您有一个命名空间l映射到本地代码(。 此处发生的情况是,WPF 会自动将资源的键设置为DataType(请务必注意:资源键不必是字符串!

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

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

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

相关内容

最新更新