如何绑定WPF DataGrid中的DataGridComboBoxColumn

4

我的项目使用MVVM,我想将DataGridComboBoxColumn绑定到视图模型。

下拉列表框应该有“<”(键为“1”)和“<=”(键为“2”)这两个选项。

首先,我有一个带有下拉列表框项目的observablecollection

public ObservableCollection<ArithmeticSignData> LowerComparerItems { get; set; }

这是一个名为ArithmeticSignData的类:
public class ArithmeticSignData
{
    public ArithmeticSignData(string key, string value)
    {
        ArithmeticSignKey = key;
        ArithmeticSignValue = value;
    }

    public string ArithmeticSignKey { get; set; }
    public string ArithmeticSignValue { get; set; }
}

当我的视图模型被初始化时,我会填充列表LowerComparerItems:
private void FillLowerComparerItemsList()
{
    LowerComparerItems = new ObservableCollection<ArithmeticSignData>();
    LowerComparerItems.Add(new ArithmeticSignData("1", "<"));
    LowerComparerItems.Add(new ArithmeticSignData("2", "<="));
}

数据网格的数据来自另一个ObservableCollection,其实体框架表为类型。该表有一个名为“low_operator”的列。因此我认为可以通过以下方式绑定comboboxcolumn。当我打开combobox时,我可以看到项目。但是在启动应用程序后,表中的值没有被翻译为“<”或“<=”。

<DataGridComboBoxColumn x:Name="cbc_LowerComparer"
                                    SelectedItemBinding="{Binding low_operator, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                    DisplayMemberPath="ArithmeticSignValue"
                                    Header=" "
                                    Width="30">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparerItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparerItems, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
            <Setter Property="IsEditable" Value="True"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
3个回答

4
你应该将 SelectedValue ValueBinding 属性添加到你的绑定中,并将 SelectedValuePath 属性设置为 "ArithmeticSignKey":
<DataGridComboBoxColumn x:Name="cbc_LowerComparer"
                                    SelectedValueBinding="{Binding low_operator, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                    SelectedValuePath="ArithmeticSignKey"
                                    DisplayMemberPath="ArithmeticSignValue"
                                    Header=" "
                                    Width="30">

这将把low_operator列设置为所选ArithmeticSignKey值的值。如果您想将其设置为ArithmeticSignValue,则应将该列的SelectedValuePath属性设置为此名称。

2
非常感谢mm8!ComboBox已经很难了,但在DataGrid内部它们更加困难。 - Patrick Pirzer

1
将您的代码编辑为以下形式:

像这样:

<DataGridComboBoxColumn x:Name="cbc_LowerComparer"
                                ItemsSource="{Binding LowerComparerItems, UpdateSourceTrigger=PropertyChanged}"
                                SelectedItemBinding="{Binding low_operator, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                DisplayMemberPath="ArithmeticSignValue"
                                Header=" "
                                Width="30">

1

使用这个替代SelectedItemBinding...

SelectedValueBinding="{Binding low_operator}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接