Команда привязки DataGrid для выбора строки

Я хочу выполнить команду, когда пользователь выбирает строку в DataGrid.

Я вижу, что возможно обернуть содержимое ячейки в кнопки (хотя я не хочу стиль кнопки) - но я не хочу делать это на уровне ячейки.

Я также вижу возможность использовать поведения, чтобы связать команду с событием. Но желательно, чтобы мне не приходилось прибегать к поведению для выполнения такой общей задачи.

Можно ли сделать это с помощью простой старой привязки данных команды?

Итак: 1) пользователь щелкает строку DataGrid 2) запускается команда на модель представления.

Ответы

Ответ 1

Вы должны использовать сборку "Интерактивность" и событие SelectionChanged.

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding ID}" />
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
    </DataGrid.Columns>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding MyCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>

Где "i" - пространство имен:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Также вы можете написать привязку к свойству SelectedItem DataGrid, а в наборе доступа вы можете вызвать свою команду, но первое решение, которое я вам представил выше, лучше.

Если вы хотите вызвать команду из основной модели представления и передать SelectedItem из DataGrid, вы можете использовать CommadParameter:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding MyCommand}" 
        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

Когда элементы имеют собственную команду, вы можете использовать следующий код:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=SelectedItem.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

Или, если у элементов есть собственная модель представления, которая ему назначена DataContext, вы можете использовать следующий код:

 <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=SelectedItem.DataContext.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>