WPF — привязать перечисление к DatagridComboBoxColumn с режимом TwoWay

Я пытаюсь создать таблицу DataGrid со столбцом DatagridComboBoxColumn, имеющим доступные варианты из перечисления. Текущий код ниже может привязывать только значение перечисления OneWay из привязки PaletteColors. Я хочу, чтобы значение перечисления в PaletteColors[x].Type обновлялось, когда пользователь выбирает значение перечисления из раскрывающегося списка. Как нам обновить xaml для этого?

Table.xaml

    <Grid.Resources>
        <!-- 
        Resource for displaying enum values
        -->
        <ObjectDataProvider x:Key="PaletteColorInterfaceTypes"
                            MethodName="GetValues" 
                            ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="enums:PaletteColorInterfaceType" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Grid.Resources>

    <DataGrid
              IsReadOnly="False"
              ItemsSource="{Binding Path=PaletteColors}"
              SelectedItem="{Binding SelectedColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Location" ItemsSource="{Binding Source={StaticResource PaletteColorInterfaceTypes}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" SelectedValueBinding="{Binding Path=Type}" Width="*" />
        </DataGrid.Columns>
        </DataGrid>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftClick">
                    <i:InvokeCommandAction Command="{Binding ColorSelectedCommand}" />
                </i:EventTrigger>
                <i:EventTrigger EventName="CellEditEnding">
                    <command:EventToCommand PassEventArgsToCommand="True" Command="{Binding CellEditedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>

Перечисление

public enum PaletteColorInterfaceType
{
    Invalid = 0,
    A,
    B,
}

PaletteColor.cs

public class PaletteColor : IEquatable<PaletteColor>
{
    public PaletteColor(
        string name,
        PaletteColorInterfaceType type)
    {
        this.Name = name;
        this.Type = type;
    }

    public string Name { get; set; }

    public PaletteColorInterfaceType Type { get; set; }
}

TableViewModel.cs

public SortableObservableCollection<PaletteColor> PaletteColors { get; }

public PaletteColor SelectedColor { get; set; }

person XtremeCold    schedule 07.05.2021    source источник
comment
Я попробовал этот код сейчас и, кажется, работает нормально?   -  person Mark Feldman    schedule 08.05.2021
comment
Да, это сработало бы, если бы он загружал типы из списка PaletteColors и отображал значения в ячейках. Однако, если я хочу выбрать другое значение из ячейки, новое выбранное значение ячейки не отражается в списке PaletteColors. В основном он работает только в режиме OneWay.   -  person XtremeCold    schedule 08.05.2021
comment
Извините, я прочитал то, что вы только что написали, примерно 10 раз, и я до сих пор не могу понять, что вы пытаетесь сделать (я предполагаю, что именно поэтому никто не ответил на это). Ваш DataGrid в настоящее время отражает список PaletteColors, при этом текущий выбранный привязан к SelectedColor. Каждая ячейка в DataGridComboBoxColumn показывает полный список возможных значений PaletteColorInterfaceType, и их выбор обновляет Type в текущем SelectedColor. Это нормальное использование, а также то, как ваш код ведет себя в настоящее время, какое другое поведение вы ожидаете?   -  person Mark Feldman    schedule 09.05.2021
comment
О, мои извинения за путаницу. Вы указали на SelectedColor, который я не думал использовать для проверки обновленного значения, когда ячейка обновляется до нового значения перечисления. Вместо этого я думал посмотреть на значения в PaletteColors. Когда я начал изучать SelectedColor, я обнаружил, что выбранный элемент привязан неправильно. Я не вижу, чтобы SelectedColor имело значение выбранной строки. Вы видите в этом проблему?   -  person XtremeCold    schedule 10.05.2021
comment
Казалось, что у меня все работает нормально, я поставил точку останова на установщике SelectedColor, и он определенно попал, когда выбор изменился. и со значением, установленным для правильного элемента. Единственное, что я изменил в вашем коде, это сделать PaletteColors типа ObservableCollection‹PaletteColor›, поскольку у меня нет исходного кода для SortableObservableCollection, который вы используете.   -  person Mark Feldman    schedule 10.05.2021
comment
Ох, хорошо. Мой установщик не вызывается при выборе строки. Как вы создаете триггеры событий? Я обновил приведенный выше xaml, чтобы иметь триггеры событий.   -  person XtremeCold    schedule 10.05.2021
comment
Нет-нет, вы уже привязываете SelectedItem к свойству SelectedColor, поэтому вам не нужны триггеры событий. Как я уже сказал, когда я вставил ваш код в тестовое приложение, он работал нормально для меня, в вашем коде должно быть что-то еще, что вы не опубликовали здесь.   -  person Mark Feldman    schedule 10.05.2021
comment
На самом деле привязка теряется после редактирования значения ячейки. Проблема в том, что GetHashCode() в классе PaletteColor был переопределен, как описано в stackoverflow.com/questions/17309915/. Большое спасибо, Марк, за вашу помощь и предложение.   -  person XtremeCold    schedule 10.05.2021