在数据网格中,如何在还使用 CompositeCollection 时为每一行绑定不同的 ItemsSource?

In a datagrid, how do you bind a different ItemsSource for each row when also using a CompositeCollection?

我有一个 DataGrid,其中 ItemsSource 绑定到一个 ObservableCollection

<DataGrid ItemsSource="{Binding Items}">

ObservableCollection 中的每个项目也有一个 ObservableCollection 字符串。

其中一列是包含组合框的 DataGridTemplateColumn。我希望每一行的 ComboBox 都包含该行 ViewModel 中字符串的 ObservableCollection 中的项目。如果我正常绑定它,这有效。但是,如果我使用的是 CompositeCollection,我似乎无法让它工作。

<DataGridTemplateColumn Header="Column Title">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox SelectedValue="{Binding Selected, UpdateSourceTrigger=PropertyChanged}">
                <ComboBox.ItemsSource>
                    <CompositeCollection>
                        <CollectionContainer Collection="{Binding ???}" />
                        <ComboBoxItem>
                            <TextBlock>
                                <Hyperlink Command="{Binding DataContext.EditList, Source={x:Reference myGridName}}">Edit List</Hyperlink>
                            </TextBlock>
                        </ComboBoxItem>
                    </CompositeCollection>
                </ComboBox.ItemsSource>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我不确定绑定要使用什么才能使其正常工作。没有 CompositeCollection,我可以简单地做:

<ComboBox ItemsSource="{Binding SubItems}">

在搜索时,我知道您需要为 CollectionContainer 设置源,但大多数示例都是将其设置为对所有行都相同的静态列表。我需要每一行绑定到该行的 ViewModel 中的 ObservableCollection。

我试过:

<CollectionContainer Collection="{Binding DataContext.SubItems, RelativeSource={RelativeSource AncestorType=ComboBox}}" />

但这会导致错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ComboBox', AncestorLevel='1'' ...

通过为该模板列指定 CellTemplate 和 EditTemplate,您可以在组合框列中绑定不同的项目源。

请参考以下内容link: https://www.syncfusion.com/kb/4896/how-to-bind-different-itemssources-to-each-row-of-the-combobox-by-using-gridtemplatecolumn-in-the

您可以使用以下数据模板:

<DataTemplate>
    <ComboBox x:Name="cb"
                            SelectedValue="{Binding Selected, UpdateSourceTrigger=PropertyChanged}">
        <ComboBox.Resources>
            <DiscreteObjectKeyFrame x:Key="proxy" Value="{Binding ElementName=cb}"/>
        </ComboBox.Resources>
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <CollectionContainer Collection="{Binding Value.DataContext.SubItems, Source={StaticResource proxy}}" />
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>
</DataTemplate>

x:Refefrence来自这个explanation. However, this answer is not enough. In fact, you need a proxy as explained in .

希望对您有所帮助。