DataGridComboBoxColumn - как привязать команду к смене значения?

Есть DataGrid, в нём задан столбец DataGridComboBoxColumn. Как привязать команду к смене значения выбранного элемента в нём? Пробовал через Interaction.Triggers, но он на DataGridComboBoxColumn похоже не работает.

Пробовал вот так вот через триггер :

<DataGridComboBoxColumn .. >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding DataContext.ChangeCategoryCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGridComboBoxColumn>

Но не срабатывает, хотя команда и путь к ней прописаны верно. С других событий на форме этот биндинг работает.

В качестве обходного решения сделал через обработчик событий в самом окне.

 <DataGridComboBoxColumn.EditingElementStyle>
     <Style TargetType="ComboBox">
         <EventSetter Event="SelectionChanged" Handler="ComboBox_SelectionChanged"/>

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    (DataContext as RegistryDeviceViewModel).ChangeCategoryCommand.Execute(sender);
}

Но это ведь плохой стиль в рамках паттерна MVVM? Как правильно закрепить команду за сменой выбора в DataGridComboBoxColumn ?


Ответы (1 шт):

Автор решения: aepot

Зачем команду совать туда, где есть привязанное свойство (данные)?

Документация

Берём комбобокс колонку, привязываем SelectedItemBinding

<DataGridComboBoxColumn SelectedItemBinding="{Binding ComboItem}" ItemsSource="{Binding ComboItems}" />

Во вьюмодели делаем свойство, и в сеттере прописываем вызов кода:

private T _comboItem;

public T ComboItem
{
    get => _comboItem;
    set
    {
        _comboItem = value;
        OnComboBoxValueChanged();
    }
}

private void OnComboBoxValueChanged()
{
    // вызовется при изменении значения
}
→ Ссылка