В сетке данных, как вы связываете разные 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