Как заставить элементы редактора столбца ComboBox сохранить выбранное пользователем новое значение? - PullRequest
0 голосов
/ 06 мая 2019

Полный XAML и код-код приведены ниже. У меня есть окно с DataGrid с одним столбцом, DataGridComboBoxColumn. В его EditingElementStyle я установил редактируемые ComboBox-es и установил для их ItemsSource ту же коллекцию, к которой я привязал свойство ElementStyle. Кажется, что привязки работают хорошо, пока я не запустил программу и не попытался изменить значение ячейки на другое значение. Хотя в настоящее время я выбираю только из существующих значений (в будущем я хочу разрешить ввод пользовательских элементов), значение не сохраняется, а предыдущее значение отображается после перемещения фокуса.

Если я поставлю только это в окне:

<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>

Кажется, все работает.

1008 * XAML * <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> Код-за

public partial class TestWindow : Window
{
    public ObservableCollection<ItemType> MyItems { get; set; }
    public ObservableCollection<string> MyGroups { get; set; }
    public TestWindow()
    {
        InitializeComponent();
        MyGroups = new ObservableCollection<string>();
        MyGroups.Add("test");
        MyGroups.Add("test 2");
        MyItems = new ObservableCollection<ItemType>();
        MyItems.Add(new ItemType()
        {
            Value = "test"
        });
        MyItems.Add(new ItemType()
        {
            Value = "test 2"
        });
        MyDataGrid.ItemsSource = MyItems;
    }
}

public class ItemType : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
    protected string _Value = "";
    public string Value
    {
        get
        {
            return _Value;
        }
        set
        {
            if (_Value != value)
            {
                _Value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

Ожидаемое:

  1. Пользователь выбирает ячейку,
  2. входит в режим редактирования (двойным щелчком или F2) и
  3. выбирает из раскрывающегося списка другое значение, чем указанное ранее.
  4. Пользователь меняет выбранную ячейку на другую
  5. и ранее сфокусированная ячейка остается с новым выбранным значением.

Факт: пользователь выполняет те же действия, что и выше, но при фокусировке другой ячейки после выбора нового значения ранее сфокусированная ячейка остается с начальным значением.

1 Ответ

0 голосов
/ 06 мая 2019

Кажется, что TextBinding уже с Mode=TwoWay.Я только что удалил эту строку из разметки, и все работает как положено:

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