1

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

<DataGrid ItemsSource="{Binding Items}">

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

其中一列是包含 ComboBox 的 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>

我不确定要使用什么来让 Binding 正常工作。没有 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'' ...
4

2 回答 2

2

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

<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来自这个解释。但是,这个答案还不够。事实上,您需要一个代理,如本答案中所述。

希望能帮助到你。

于 2017-02-24T06:21:33.307 回答
0

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

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

于 2017-02-24T05:47:17.977 回答