如何将 ItemsControl 与多个 ItemsSource 嵌套?
How to nest ItemsControl with multiple ItemsSource?
我有一个带有名称和 Dictionary
的 ConfigList
对象,我需要用不同的 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
。数据模板用于创建显示数据的控件。然后将创建的项目放入 ItemsControl
的 Items
集合中。如果您直接在 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.
但是,在您的情况下,这不是真正的问题,因为您的标记对于您想要实现的目标是错误的。如果你真的打算嵌套 ItemsControl
s,你只需更改外部 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
可能更合适。
我有一个带有名称和 Dictionary
的 ConfigList
对象,我需要用不同的 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
。数据模板用于创建显示数据的控件。然后将创建的项目放入 ItemsControl
的 Items
集合中。如果您直接在 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 yourItemsControl
. When theItemsSource
property is set, theItems
collection is made read-only and fixed-size.
但是,在您的情况下,这不是真正的问题,因为您的标记对于您想要实现的目标是错误的。如果你真的打算嵌套 ItemsControl
s,你只需更改外部 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
可能更合适。