具有单个源和数据类型的 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;
}