如何使ComboBox列的编辑器元素保存用户选择的新值?

时间:2019-05-06 14:44:22

标签: c# wpf data-binding datagrid datagridcomboboxcolumn

完整的XAML及其代码如下。我有一个带有DataGrid的窗口,其中只有一个列,即DataGridComboBoxColumn。在其EditingElementStyle中,我将ComboBox-es设置为可编辑,并将其ItemsSource设置为在ElementStyle属性中绑定到的同一集合。在我运行程序并尝试将单元格的值更改为另一个值之前,绑定似乎工作良好。尽管我目前仅从现有值中选择(以后我希望允许输入自定义项目),但该值不会保存,并且在移动焦点后会显示以前的值。

如果我只把它放在窗口中:

program

一切似乎都正常。

XAML

<StackPanel Orientation="Vertical">
    <ComboBox ItemsSource="{Binding Path=MyGroups,
                            RelativeSource={RelativeSource Mode=FindAncestor,
                            AncestorType={x:Type Window}}}" IsEditable="True"/>
    <ComboBox ItemsSource="{Binding Path=MyGroups,
                            RelativeSource={RelativeSource Mode=FindAncestor,
                            AncestorType={x:Type Window}}}" IsEditable="True"/>
</StackPanel>

隐藏代码

<Window x:Class="cs_wpf_test_11.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:cs_wpf_test_11"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="TestWindow" Height="450" Width="800">
    <Grid>
        <DataGrid Name="MyDataGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="My only column"
                                        SelectedItemBinding="{Binding Value, Mode=TwoWay}"
                                        TextBinding="{Binding Value}">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Path=MyGroups,
                                RelativeSource={RelativeSource Mode=FindAncestor,
                                AncestorType={x:Type Window}}}"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="IsEditable" Value="True"/>
                            <Setter Property="ItemsSource" Value="{Binding Path=MyGroups,
                                RelativeSource={RelativeSource Mode=FindAncestor,
                                AncestorType={x:Type Window}}}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

预期:

  1. 用户选择一个单元格,
  2. 进入其编辑模式(通过双击或F2键),然后
  3. 从下拉列表中选择另一个值,而不是先前显示的值。
  4. 用户将所选单元格更改为另一个单元格
  5. 并且先前关注的单元格保持新选择的值。

Actual:用户执行与上述相同的步骤,但是在选择新值后聚焦另一个单元格时,先前聚焦的单元格将保留初始值。

1 个答案:

答案 0 :(得分:0)

似乎TextBinding已经与Mode=TwoWay一起使用。我刚刚从标记中删除了这一行,一切都按预期进行:

SelectedItemBinding="{Binding Value, Mode=TwoWay}"