Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF ItemsControl具有单个源和数据类型,但多个数据模板不起作用_Wpf_Xaml_Itemscontrol - Fatal编程技术网

WPF ItemsControl具有单个源和数据类型,但多个数据模板不起作用

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

下面的My Items控件有两个
数据模板
,一个源,其中包含一个
数据类型
命名管道。 如果我删除了
数据模板
中的任何一个,那么它就会工作。 使用这两种方法,我得到以下错误

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;
}