我有以下合并到我的主题/Generic.xaml文件中的ResourceDictionary
<DataTemplate DataType="{x:Type model:RequirementResourceRelation}" x:Key="{x:Static local:Resources.RequirementResourceRelationListTemplateKey}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Resource.Name, TargetNullValue=Loading...}" />
<TextBlock Grid.Column="1" Text="-" />
<TextBlock Grid.Column="2" MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Path=RelationType, TargetNullValue=Loading...}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type model:RequirementResourceRelation}" x:Key="{x:Static local:Resources.RequirementResourceRelationListTemplate2Key}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Requirement.Name, TargetNullValue=Loading...}" />
<TextBlock Grid.Column="1" Text="-" />
<TextBlock Grid.Column="2" MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Path=RelationType, TargetNullValue=Loading...}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" />
</Grid>
</DataTemplate>我正在尝试用不同的ComponentResourceKey为相同的DataType创建两个不同的数据模板。正如您所看到的,其中一个键附加了一个2。
在我的local:Resources类中,我有以下内容,这是我使用的ComponentResourceKey。
public static ComponentResourceKey RequirementResourceRelationListTemplateKey {
get {
return new ComponentResourceKey(typeof(Resources), "RequirementResourceRelationListTemplate");
}
}
public static ComponentResourceKey RequirementResourceRelationListTemplate2Key {
get {
return new ComponentResourceKey(typeof(Resources), "RequirementResourceRelationListTemplate2");
}
}如果我只有一个DataTemplates在里面,这是可行的,但是一旦我添加了第二个,我就会得到一个异常,说:
Item has already been added. Key in dictionary: 'DataTemplateKey(HR.TrackingTool.Model.RequirementResourceRelation)' Key being added: 'DataTemplateKey(HR.TrackingTool.Model.RequirementResourceRelation)'
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
at System.Collections.Hashtable.Add(Object key, Object value)
at System.Windows.ResourceDictionary.SetKeys(IList`1 keyCollection, IServiceProvider serviceProvider)
at System.Windows.ResourceDictionary.SetDeferrableContent(DeferrableContent deferrableContent)
at System.Windows.Baml2006.WpfSharedBamlSchemaContext.<Create_BamlProperty_ResourceDictionary_DeferrableContent>b__168(Object target, Object value)
at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)在添加DataTemplate时,ResourceDictionary似乎忽略了该键。当使用ComponentRelationKey时,ResourceDictionary会忽略key属性吗?
有什么办法绕过这个异常吗?
谢谢,劳尔
发布于 2010-07-30 20:20:44
如果通过键引用DataTemplate,就不能省略DataType规范吗?如果没有DataType="{x:Type model:RequirementResourceRelation}“(这显然是添加项的键),您的x:Key应该用作键。
发布于 2013-11-08 00:39:36
显然,问题就像所说的那样。声明样式的顺序很重要。
当同一TargetType的两个样式的第一个属性是TargetType时,例如
<Style TargetType="{x:Type TextBlock}" x:Key="_defaultRuleTextBlockStyle">
<Style TargetType="{x:Type TextBlock}" x:Key="_tinySourceCodeTextBlockStyle">然后你就会得到错误。它似乎忽略了TargetType :属性,并且如前所述使用类型值作为字典键,例如“{x: TextBlock}”
如果同一个TargetType的两个样式的第一个元素是x:Key,则不需要这样做,如下所示。
<Style x:Key="_defaultRuleTextBlockStyle" TargetType="{x:Type TextBlock}">
<Style x:Key="_tinySourceCodeTextBlockStyle" TargetType="{x:Type TextBlock}">我想,如果你把这些垃圾搬来搬去也没关系。明智地说,总是从x: WOrd 开始,但这是一个非常愚蠢的错误。
发布于 2012-11-30 20:04:35
在另一个控件的<Resources>元素内移动DataTemplate。
在Silverlight中,这工作得很好:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<!--Template 1-->
<DataTemplate DataType="VMType" x:Key="Template1">
...
</DataTemplate>
<!--Template 2-->
<DataTemplate DataType="VMType" x:Key="Template2">
...
</DataTemplate>
<!--Control Style, references the two templates above-->
<Style TargetType="ControlType">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ControlType">
<Grid Background="White" Margin="0">
...
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>但在WPF中,我必须将3个模板移动到控件内部:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Style TargetType="ControlType">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ControlType">
<Grid Background="White" Margin="0">
<!--MOVED HERE INSTEAD OF THE ROOT-->
<Grid.Resources>
<!--Template 1-->
<DataTemplate DataType="VMType" x:Key="Template1">
...
</DataTemplate>
<!--Template 2-->
<DataTemplate DataType="VMType" x:Key="Template2">
...
</DataTemplate>
</Grid.Resources>
...
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>现在它在WPF和Silverlight中都可以正常工作,没有错误。
https://stackoverflow.com/questions/3367237
复制相似问题