【问题标题】:WPF ItemsControl with a single Source and DataType, but multiple DataTemplates not workingWPF ItemsControl 具有单个 Source 和 DataType,但多个 DataTemplates 不起作用
【发布时间】:2021-05-09 08:35:18
【问题描述】:

我的 ItemsCONtrol 下面有两个 DataTemplates,一个源,其中包含一个名为 Conduits 的 DataType。 如果我删除 DataTemplates 中的任何一个,那么它可以工作。 两者都出现以下错误。

ArgumentException: Item has already been added. Key in dictionary: 
'DataTemplateKey(Drain.Models.Cad.Conduit)'  Key being added: 
'DataTemplateKey(Drain.Models.Cad.Conduit)'

这两个DataTemplates 之间的唯一区别是,一个从 Conduits 内的 UsPoints 获取数据,另一个从 Conduits 内的 DsPoints 获取数据。

我可以创建两个独立的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>

【问题讨论】:

    标签: wpf xaml itemscontrol


    【解决方案1】:

    ResourceDictionary 中 DataTemplate 的 DataType 属性会自动生成字典键。两个相同的 DataType 值显然会创建两个相同的键,这是不允许的。

    为了对同一类型的项目使用不同的 DataTemplate,您必须使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2017-10-15
      • 2016-08-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多