如何将 ItemsControl 与多个 ItemsSource 嵌套?

How to nest ItemsControl with multiple ItemsSource?

我有一个带有名称和 DictionaryConfigList 对象,我需要用不同的 ItemsSource.

嵌套 ItemsControls

我试过这样做:

<ItemsControl x:Name="TestStep" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=ConfigList }" HorizontalAlignment="Center" VerticalAlignment="Center">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Ictrl.Nom}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl
    ItemsSource="{Binding Path=Param}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Key}" />
                    <TextBlock Text=" : " />
                    <TextBlock Text="{Binding Path=Value}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ItemsControl>

当我启动我的应用程序时,我遇到了这个错误:

System.Windows.Markup.XamlParseException : '' Adding a value to the collection of type 'System.Windows.Controls.ItemCollection' threw an exception. ' line number '25' and line position '14'. '

Internal Exception InvalidOperationException: Invalid operation when ItemsSource is in use. Access and edit items with ItemsControl.ItemsSource.

知道问题出在哪里吗?

您在 ItemsControl 上设置了 ItemsSource。数据模板用于创建显示数据的控件。然后将创建的项目放入 ItemsControlItems 集合中。如果您直接在 XAML 中向 ItemsControl 添加一个元素,这也会将它们放入 Items 集合中。两者都是不允许的。您可以指定 ItemsSource 或直接添加到 Items。来自 documentation:

Note that you use either the Items or the ItemsSource property to specify the collection that should be used to generate the content of your ItemsControl. When the ItemsSource property is set, the Items collection is made read-only and fixed-size.

但是,在您的情况下,这不是真正的问题,因为您的标记对于您想要实现的目标是错误的。如果你真的打算嵌套 ItemsControls,你只需更改外部 ItemsControl 的数据模板以包含另一个 ItemsControl 绑定到外部的集合 属性数据项。由于已经有 TextBox,您必须使用面板(例如 StackPanel)在模板中承载多个控件。

<ItemsControl x:Name="TestStep" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=ConfigList }" HorizontalAlignment="Center" VerticalAlignment="Center">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=Ictrl.Nom}" />
                <ItemsControl ItemsSource="{Binding Path=Param}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Path=Key}" />
                                <TextBlock Text=" : " />
                                <TextBlock Text="{Binding Path=Value}" />
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果您想要数据的分层视图,使用 TreeView 可能更合适。