В сетке данных, как вы связываете разные ItemsSource для каждой строки, когда также используете CompositeCollection?

У меня есть DataGrid, где ItemsSource связан с ObservableCollection

<DataGrid ItemsSource="{Binding Items}">

Каждый элемент в ObservableCollection также имеет ObservableCollection строк.

Одним из столбцов является DataGridTemplateColumn, который содержит ComboBox. Я хотел бы, чтобы ComboBox каждой строки содержал элементы в ObservableCollection строк в ViewModel этой строки. Если я связываю это нормально, это работает. Тем не менее, я не могу заставить его работать, если я использую 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, но большинство примеров были для установки его в статический список, который одинаков для всех строк. Мне нужно, чтобы каждая строка была привязана к ObservableCollection в ViewModel этой строки.

Я пробовал:

<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'' ...

2 ответа

Решение

Вы можете использовать следующий DataTemplate:

<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 исходит из этого объяснения. Однако этого ответа недостаточно. На самом деле вам нужен прокси, как объяснено в этом ответе.

Надеюсь, поможет.

Указав CellTemplate и EditTemplate для этого столбца Template, вы можете связать различные источники элементов в столбце combobox.

Пожалуйста, обратитесь по ссылке ниже: https://www.syncfusion.com/kb/4896/how-to-bind-different-itemssources-to-each-row-of-the-combobox-by-using-gridtemplatecolumn-in-the

Другие вопросы по тегам