在数据网格中,如何在还使用 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,您可以在组合框列中绑定不同的项目源。
您可以使用以下数据模板:
<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 .
希望对您有所帮助。
我有一个 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,您可以在组合框列中绑定不同的项目源。
您可以使用以下数据模板:
<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
希望对您有所帮助。