如何指定默认的DataTemplate在XAML的静态资源

问题描述 投票:2回答:2

我有我的一个类定义的默认模板。它的工作原理正确,因为我想到的是应用,但我使用的附加属性(详细here,实际上)对我有指定DataTemplate。我一直无法找到指定的XAML我的默认模板的一种可接受的方式。

我的数据模板看起来是这样的:

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

到目前为止,我已经尝试这样指定它

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

但是这将引发异常运行时(“无法找到名为‘My.Full.NameSpace.MyType’资源。资源名称是区分大小写的。”)。

我已经做了足够的东张西望知道其他人也有类似的问题,但我一直没能找到一个体面的解决办法。我正在考虑干脆保持一个重复DataTemplatex:Key这样我就可以在这点。有没有更好的办法?

更新:

好了 - 它已经指出,如果你使用DynamicResource代替StaticResource这确实工作。这是没有道理给我。

我读过DynamicResource VS静态资源公平位(以及其他的东西,我读this thread)。这是我所知道的:

  • 如果我指定一个x:Key而不是DataType的,我可以用这个模板作为StaticResource
  • 当页面加载模板在字典中,可以在代码检索 var myTemplate = this.Resources[new DataTemplateKey(typeof(MyType))];

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

wpf xaml
2个回答
1
投票

试试这个:(开关StaticResourceDynamicResource

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

我为什么这个工程的原因猜测:

This answerStaticResourceDynamicResource之间的良好区别。我猜这个默认的模板数据不可用时StaticResource试图找回它(XAML负荷期间),这是不是DynamicResource的情况下


0
投票

我猜,因为你的DataTemplate的问题有DataTemplateKeymyNS: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

© www.soinside.com 2019 - 2024. All rights reserved.