在 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 绑定的内容。