如何在XAML中将默认datatemplate指定为静态资源

时间:2014-02-19 14:17:52

标签: wpf xaml

我有一个为我的某个类定义的默认模板。它正常工作并按照我的预期应用,但我使用附加属性(实际上是详细的here),我必须为其指定DataTemplate。我一直无法找到在XAML中指定默认模板的可接受方式。

我的数据模板如下所示:

<DataTemplate DataType="{x:Type myNS:MyType}">
    ....
</DataTemplate>

到目前为止,我试图像这样指定它

attached:property.MyDataTemplate="{StaticResource {x:Type myNS:MyType}}"

但是这会在运行时抛出异常(“找不到名为'My.Full.NameSpace.MyType'的资源。资源名称区分大小写。”)。

我已经做足够的事情来了解其他人有类似的问题,但我找不到合适的解决方案。我正在考虑简单地使用DataTemplate维护重复x:Key,以便我可以指出它。还有更好的方法吗?

更新:

好吧 - 有人指出,如果你使用DynamicResource代替StaticResource,这确实有效。这对我没有意义。

我在DynamicResource和StaticResource上读过一些内容(除此之外,我读过this thread)。这就是我所知道的:

  • 如果我指定了x:Key而不是DataType,我可以将此模板用作StaticResource

  • 当页面加载时,模板位于字典中,可以在代码中检索

    var myTemplate = this.Resources[new DataTemplateKey(typeof(MyType))];

有谁能解释这里发生了什么?

2 个答案:

答案 0 :(得分:1)

尝试一下:(将StaticResource切换为DynamicResource

attached:property.MyDataTemplate="{DynamicResource {x:Type myNS:MyType}}"

我的猜测,原因如下:

This answerStaticResourceDynamicResource之间提供了很好的区别。我猜这个默认模板数据在StaticResource尝试检索它时(在加载XAML期间)不可用,而DynamicResource不是这种情况

答案 1 :(得分:0)

我猜是由于您的DataTemplate具有DataTemplateKey类型的myNS:MyType而引起的问题,但是property.MyDataTemplate="{StaticResource {x:Type myNS:MyType}}"试图查找具有与您的类型全名匹配的字符串键的资源。 / p>

您应该使用:

代替使用"{StaticResource {x:Type myNS:MyType}}"

"{StaticResource {DataTemplateKey {x:Type myNS:MyType}}}"

或其完全等效的内容:

"{StaticResource ResourceKey={DataTemplateKey DataType={x:Type myNS:MyType}}}"

此外,在这种情况下,您不需要DynamicResource