在 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对象。如果找到一个,它会使用该模板来渲染 选项卡项的内容属性引用的ViewModel对象。
我的问题是:
模板如何知道类型是工作空间的集合(WorkspaceViewModel)?
答案 0 :(得分:4)
WPF并不真正关心具体类型,它只需要一些IEnumerable的东西,WPF使用类型描述符来知道ui绑定的内容。
答案 1 :(得分:4)
在您发布的代码中不需要。在您的示例中,您为内容模板赋予了严格的价值:您已明确使用{StaticResource WorkspacesTemplate}
,因此会查找密钥为"WorkspacesTemplate
的资源。
因为您已经明确设置了模板,所以预期的类型无关紧要:它会尝试使用您设置的模板显示Content
中的任何对象 - 具有不同程度的如果你使用不匹配的类型会成功!
在您提到的替代方法中 - 使用“typed DataTemplate”,您将使用<DataTemplate DataType="{x:Type l:WorkSpace}" />
声明您的datatemplate。请注意,没有x:Key
(并且我还假设您有一个名称空间l
映射到您的本地代码)。这里发生的是WPF自动将资源的密钥设置为DataType
(重要的是要注意:资源密钥不必是字符串!)。
然后,当您声明HeaderedContentControl
时,您可以省略设置ContentTemplate
。在运行时,当呈现控件时,WPF将检查Content
对象的类型并发现它是WorkSpace
,然后它将查找具有x:Key="{x:Type l:WorkSpace}"
的资源 - 将匹配您键入的模板。
这是在整个应用程序中对数据进行一致表示的有用方法,因为在整个应用程序中,任何内容呈现控件都会自动使用键入的DataTemplate
。