WPF ItemsControl具有单个源和数据类型,但多个数据模板不起作用
下面的My Items控件有两个WPF ItemsControl具有单个源和数据类型,但多个数据模板不起作用,wpf,xaml,itemscontrol,Wpf,Xaml,Itemscontrol,下面的My Items控件有两个数据模板,一个源,其中包含一个数据类型命名管道。 如果我删除了数据模板中的任何一个,那么它就会工作。 使用这两种方法,我得到以下错误 ArgumentException: Item has already been added. Key in dictionary: 'DataTemplateKey(Drain.Models.Cad.Conduit)' Key being added: 'DataTemplateKey(Drain.Models.Cad.Co
数据模板
,一个源,其中包含一个数据类型
命名管道。
如果我删除了数据模板
中的任何一个,那么它就会工作。
使用这两种方法,我得到以下错误
ArgumentException: Item has already been added. Key in dictionary:
'DataTemplateKey(Drain.Models.Cad.Conduit)' Key being added:
'DataTemplateKey(Drain.Models.Cad.Conduit)'
两个数据模板
之间的唯一区别在于,一个从管道内的UsPoints
获取数据,另一个DsPoints
也在管道内
我可以创建两个独立的项控件
,但我已经有了八个,我不确定通过创建额外的项控件
在性能方面解决这些问题是否有任何危害
对我应该如何进行有什么建议吗
<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的
数据类型
属性自动生成字典键。两个相同的数据类型值显然会创建两个相同的键,这是不允许的
为了对相同类型的项使用不同的DataTemplates,您必须使用DataTemplateSelector
,并将其分配给ItemsControl的ItemTemplateSelector
属性
但是,必须有一种方法来决定为特定项目选择哪个数据模板,例如项目属性:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Conduit conduit)
{
return conduit.UsPoints != null
? UsPointsDataTemplate
: DsPointsDataTemplate;
}
return null;
}