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)?
在您发布的代码中不需要这样做。在您的示例中,您为内容模板指定了严格的值:您已明确使用,因此会查找{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将被整个应用程序中的任何内容呈现控件自动使用。