如何绑定到集合内部的集合?
How to bind to a collection inside of a collection?
我正在尝试将 itemscontrol 绑定到另一个集合中的一个集合。为此,我在另一个项目控件内分层了一个项目控件,如下所示:
<ItemsControl ItemsSource="{Binding MachinistUnreportedOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding MultiJobOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<DataTemplate>
<TextBlock>
<Run Text="Op " />
<Run Text="{Binding JobOperation}" />
</TextBlock>
</DataTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这最终将绑定到来自 entity framework 的来源,但由于我遇到了问题,所以我只是将此虚拟数据放入我的视图模型中:
MachinistUnreportedOps = new ObservableCollection<SimpleClass>()
{
new()
{
MultiJobOps = new()
{
new() { JobOperation = 100 },
new() { JobOperation = 101 },
new() { JobOperation = 102 },
},
},
new()
{
MultiJobOps = new()
{
new() { JobOperation = 103 },
new() { JobOperation = 104 },
new() { JobOperation = 105 },
},
},
};
(SimpleClass
几乎只包含一些数据,我试图在上面 xaml 中访问这些数据。显然它有一个 JobOperation
属性,这是一个整数。)
不幸的是,此数据和使用 EF 时会出现同样的问题:
System.Windows.Markup.XamlParseException: 'Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.'
有内部异常:
System.InvalidOperationException: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
我已经调查过这个错误,但大多数问题(比如这个:Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead)似乎与直接访问控件和更改其中的项目有关,而我根本没有这样做.我的代码隐藏或视图模型中没有对 itemscontrol 的引用。我什至没有在其他任何地方访问我的代码中的 MachinistUnreportedOps
集合,更不用说修改它了。我想我一定是误解了 ItemsControl
如何处理其绑定数据。我对 WPF 还是很陌生。
我找到的一件事是我丢失了 link 的一篇文章,但它建议像我在上面的 xaml 中那样定义一个项目面板。一种或另一种行为没有区别。我不太关心使用哪种面板,但网格对于内部项目控件来说会很好,因为我希望扩展它。
以答案的形式表达。您的 XAML 应该如下所示。我所做的唯一更改是将您的第二个 DataTemplate
放在 <ItemsControl.ItemTemplate>
标签内。因为这就是它存在的原因;您正在使用它来设置 ItemsControl 的 ItemTemplate 属性。
<ItemsControl ItemsSource="{Binding MachinistUnreportedOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding MultiJobOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="Op " />
<Run Text="{Binding JobOperation}" />
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我正在尝试将 itemscontrol 绑定到另一个集合中的一个集合。为此,我在另一个项目控件内分层了一个项目控件,如下所示:
<ItemsControl ItemsSource="{Binding MachinistUnreportedOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding MultiJobOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<DataTemplate>
<TextBlock>
<Run Text="Op " />
<Run Text="{Binding JobOperation}" />
</TextBlock>
</DataTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这最终将绑定到来自 entity framework 的来源,但由于我遇到了问题,所以我只是将此虚拟数据放入我的视图模型中:
MachinistUnreportedOps = new ObservableCollection<SimpleClass>()
{
new()
{
MultiJobOps = new()
{
new() { JobOperation = 100 },
new() { JobOperation = 101 },
new() { JobOperation = 102 },
},
},
new()
{
MultiJobOps = new()
{
new() { JobOperation = 103 },
new() { JobOperation = 104 },
new() { JobOperation = 105 },
},
},
};
(SimpleClass
几乎只包含一些数据,我试图在上面 xaml 中访问这些数据。显然它有一个 JobOperation
属性,这是一个整数。)
不幸的是,此数据和使用 EF 时会出现同样的问题:
System.Windows.Markup.XamlParseException: 'Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.'
有内部异常:
System.InvalidOperationException: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
我已经调查过这个错误,但大多数问题(比如这个:Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead)似乎与直接访问控件和更改其中的项目有关,而我根本没有这样做.我的代码隐藏或视图模型中没有对 itemscontrol 的引用。我什至没有在其他任何地方访问我的代码中的 MachinistUnreportedOps
集合,更不用说修改它了。我想我一定是误解了 ItemsControl
如何处理其绑定数据。我对 WPF 还是很陌生。
我找到的一件事是我丢失了 link 的一篇文章,但它建议像我在上面的 xaml 中那样定义一个项目面板。一种或另一种行为没有区别。我不太关心使用哪种面板,但网格对于内部项目控件来说会很好,因为我希望扩展它。
以答案的形式表达。您的 XAML 应该如下所示。我所做的唯一更改是将您的第二个 DataTemplate
放在 <ItemsControl.ItemTemplate>
标签内。因为这就是它存在的原因;您正在使用它来设置 ItemsControl 的 ItemTemplate 属性。
<ItemsControl ItemsSource="{Binding MachinistUnreportedOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding MultiJobOps}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="Op " />
<Run Text="{Binding JobOperation}" />
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>