我有我的一个类定义的默认模板。它的工作原理正确,因为我想到的是应用,但我使用的附加属性(详细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 VS静态资源公平位(以及其他的东西,我读this thread)。这是我所知道的:
x:Key
而不是DataType
的,我可以用这个模板作为StaticResource
。var myTemplate = this.Resources[new DataTemplateKey(typeof(MyType))];
谁能解释这里发生了什么?
试试这个:(开关StaticResource
到DynamicResource
)
attached:property.MyDataTemplate="{DynamicResource {x:Type myNS:MyType}}"
我为什么这个工程的原因猜测:
This answer给StaticResource
和DynamicResource
之间的良好区别。我猜这个默认的模板数据不可用时StaticResource
试图找回它(XAML负荷期间),这是不是DynamicResource
的情况下
我猜,因为你的DataTemplate
的问题有DataTemplateKey
型myNS:MyType
,但property.MyDataTemplate="{StaticResource {x:Type myNS:MyType}}"
试图找到字符串键匹配你的类型全名资源。
而不是使用"{StaticResource {x:Type myNS:MyType}}"
你应该使用:
"{StaticResource {DataTemplateKey {x:Type myNS:MyType}}}"
或其全等价的:
"{StaticResource ResourceKey={DataTemplateKey DataType={x:Type myNS:MyType}}}"
。
此外,您不要在此情况下,需要DynamicResource
。