当我执行以下操作并将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会根据类型自动停止应用,可以使用哪种解决方法?
答案 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)]
将代码中的数据模板放在后面。