根据类型应用DataTemplate

时间:2014-01-14 21:08:14

标签: c# wpf

当我执行以下操作并将Control的内容设置为我的ViewModel时,模板会自动应用。

 <DataTemplate DataType="{x:Type ViewModels:ViewModel}">
        <StackPanel Orientation="Vertical">
              <ControlX ....>
              <ControlY ....>
        </StackPanel>
 </DataTemplate>

但是我想使用FindResource在后面的代码中获取DataTemplate所以我必须添加一个x:key

<DataTemplate DataType="{x:Type ViewModels:ViewModel}" x:Key="{x:Type ViewModels:ViewModel}">
<DataTemplate DataType="{x:Type ViewModels:ViewModel}" x:Key="ViewModelTemplate">

但是当我添加一个x:key时,FindResource()可以正常工作,但DataTemplate会根据类型自动停止应用,可以使用哪种解决方法?

2 个答案:

答案 0 :(得分:1)

<DataTemplate DataType="{x:Type local:Task}">
  <StackPanel>
    <TextBlock Text="{Binding Path=TaskName}" />
    <TextBlock Text="{Binding Path=Description}"/>
    <TextBlock Text="{Binding Path=Priority}"/>
  </StackPanel>
</DataTemplate>
  

此DataTemplate会自动应用于所有Task对象。请注意,在这种情况下,隐式设置x:Key。因此,如果为此DataTemplate指定x:Key值,则覆盖隐式x:Key,并且不会自动应用DataTemplate。

它的作用为documented。 AFAIK你可以使用Key或DataType而不是两者,可能有我不知道的解决方法。

答案 1 :(得分:1)

作为一个糟糕的解决方法,您可以尝试创建共享相同内容的2个DataTemplate

此ControlTemplate定义共享内容:

<ControlTemplate TargetType="{x:Type ContentControl}"
                 x:Key="MyControlTemplate">
    <TextBlock Text="Some content" />
</ControlTemplate>

然后将2个DataTemplates作为解决方法:

<DataTemplate x:Key="MyDataTemplate">
    <ContentControl Template="{StaticResource MyControlTemplate}" />
</DataTemplate>
<DataTemplate DataType="{x:Type system:String}">
    <ContentControl Template="{StaticResource MyControlTemplate}" />
</DataTemplate>

修改

我知道这个答案来得太晚了,因为我在上面提供了一个看起来不好看的作品,但它总比没有好。

隐式数据模板的隐式密钥集是包含在DataTemplateKey中的数据类型。

您可以使用:

FindResource(new DataTemplateKey(typeof (MainViewModel))

Resource[new DataTemplateKey(typeof (MainViewModel)]

将代码中的数据模板放在后面。