Josh Smith MVVM演示应用

Stu*_*urm 6 c# datatemplate mvvm

MainWindow,我们有:

 <HeaderedContentControl 
          Content="{Binding Path=Workspaces}"
          ContentTemplate="{StaticResource WorkspacesTemplate}"
          Header="Workspaces"
          Style="{StaticResource MainHCCStyle}"
          />
Run Code Online (Sandbox Code Playgroud)

资源中:

  <DataTemplate x:Key="WorkspacesTemplate">
    <TabControl 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource ClosableTabItemTemplate}"
      Margin="4"
      />
  </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

文章中说:

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

我的问题是:

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

Dan*_*zey 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将被整个应用程序中的任何内容呈现控件自动使用。