具有单个源和数据类型的 WPF ItemsControl,但多个数据模板不起作用
WPF ItemsControl with a single Source and DataType, but multiple DataTemplates not working
下面我的 ItemsCONtrol 有两个 DataTemplates
,一个源包含一个 DataType
命名的 Conduits。
如果我删除 DataTemplates
中的任何一个,它就会起作用。
两者都出现以下错误。
ArgumentException: Item has already been added. Key in dictionary:
'DataTemplateKey(Drain.Models.Cad.Conduit)' Key being added:
'DataTemplateKey(Drain.Models.Cad.Conduit)'
两者之间的唯一区别 DataTemplates
是一个从 UsPoints
在 Conduits 中获取数据,另一个 DsPoints
,也在 Conduits 中。
我可以创建两个单独的 ItemsControls
,但我已经有八个了,我不确定通过创建额外的 ItemControls
来解决此类问题是否有任何危害?
关于我应该如何进行的任何建议?
<ItemsControl x:Name="ConduitHandles">
<ItemsControl.Resources>
<CollectionViewSource x:Key="ConduitHandlesUS" Source="{Binding Path=NetworkMain.Conduits}"></CollectionViewSource>
<DataTemplate DataType="{x:Type cad:Conduit}">
<Polygon
Stroke="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
Fill="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
StrokeThickness="1"
Visibility="{Binding Visible, Mode=OneWay, TargetNullValue='Visible'}"
Points="{Binding UsPoint, Mode=OneWay, Converter={StaticResource HandleConverter}}">
</Polygon>
</DataTemplate>
<DataTemplate DataType="{x:Type cad:Conduit}">
<Polygon
Stroke="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
Fill="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
StrokeThickness="1"
Visibility="{Binding Visible, Mode=OneWay, TargetNullValue='Visible'}"
Points="{Binding DsPoint, Mode=OneWay, Converter={StaticResource HandleConverter}}">
</Polygon>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ConduitHandlesUS}}"></CollectionContainer>
</CompositeCollection>
</ItemsControl.ItemsSource>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas
ClipToBounds="true">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
ResourceDictionary 中DataTemplate 的DataType
属性 自动生成Dictionary Key。两个相同的 DataType 值显然会创建两个相同的键,这是不允许的。
为了对同一类型的项目使用不同的数据模板,您必须使用 DataTemplateSelector
并将其分配给 ItemsControl 的 ItemTemplateSelector
属性。
然而,必须有一种方法来决定为特定项目选择哪个 DataTemplate,例如一项 属性:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Conduit conduit)
{
return conduit.UsPoints != null
? UsPointsDataTemplate
: DsPointsDataTemplate;
}
return null;
}
下面我的 ItemsCONtrol 有两个 DataTemplates
,一个源包含一个 DataType
命名的 Conduits。
如果我删除 DataTemplates
中的任何一个,它就会起作用。
两者都出现以下错误。
ArgumentException: Item has already been added. Key in dictionary:
'DataTemplateKey(Drain.Models.Cad.Conduit)' Key being added:
'DataTemplateKey(Drain.Models.Cad.Conduit)'
两者之间的唯一区别 DataTemplates
是一个从 UsPoints
在 Conduits 中获取数据,另一个 DsPoints
,也在 Conduits 中。
我可以创建两个单独的 ItemsControls
,但我已经有八个了,我不确定通过创建额外的 ItemControls
来解决此类问题是否有任何危害?
关于我应该如何进行的任何建议?
<ItemsControl x:Name="ConduitHandles">
<ItemsControl.Resources>
<CollectionViewSource x:Key="ConduitHandlesUS" Source="{Binding Path=NetworkMain.Conduits}"></CollectionViewSource>
<DataTemplate DataType="{x:Type cad:Conduit}">
<Polygon
Stroke="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
Fill="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
StrokeThickness="1"
Visibility="{Binding Visible, Mode=OneWay, TargetNullValue='Visible'}"
Points="{Binding UsPoint, Mode=OneWay, Converter={StaticResource HandleConverter}}">
</Polygon>
</DataTemplate>
<DataTemplate DataType="{x:Type cad:Conduit}">
<Polygon
Stroke="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
Fill="{Binding IsSelected, Mode=OneWay, Converter={StaticResource ObjectColour}, ConverterParameter=Handle}"
StrokeThickness="1"
Visibility="{Binding Visible, Mode=OneWay, TargetNullValue='Visible'}"
Points="{Binding DsPoint, Mode=OneWay, Converter={StaticResource HandleConverter}}">
</Polygon>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ConduitHandlesUS}}"></CollectionContainer>
</CompositeCollection>
</ItemsControl.ItemsSource>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas
ClipToBounds="true">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
ResourceDictionary 中DataTemplate 的DataType
属性 自动生成Dictionary Key。两个相同的 DataType 值显然会创建两个相同的键,这是不允许的。
为了对同一类型的项目使用不同的数据模板,您必须使用 DataTemplateSelector
并将其分配给 ItemsControl 的 ItemTemplateSelector
属性。
然而,必须有一种方法来决定为特定项目选择哪个 DataTemplate,例如一项 属性:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Conduit conduit)
{
return conduit.UsPoints != null
? UsPointsDataTemplate
: DsPointsDataTemplate;
}
return null;
}