我有一个为我的某个类定义的默认模板。它正常工作并按照我的预期应用,但我使用附加属性(实际上是详细的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))];
有谁能解释这里发生了什么?
答案 0 :(得分:1)
尝试一下:(将StaticResource
切换为DynamicResource
)
attached:property.MyDataTemplate="{DynamicResource {x:Type myNS:MyType}}"
我的猜测,原因如下:
This answer在StaticResource
和DynamicResource
之间提供了很好的区别。我猜这个默认模板数据在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
。