【问题标题】:Josh Smith MVVM Demo appJosh Smith MVVM 演示应用
【发布时间】:2013-06-07 07:57:52
【问题描述】:

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)?

【问题讨论】:

    标签: c# mvvm datatemplate


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在模板的一些定义中我看到了这个(在同一个项目中):什么是TargetType?
      • 当您添加目标类型时,您不必在项目控件中指定模板,wpf 会自动搜索具有相关目标类型的模板,这只是另一种选择。最佳做法是同时使用两者。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多