如何绑定到集合内部的集合?

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>