18

ユーザーがDataGridの行を選択したときにコマンドを実行したい。

セルの内容をボタンでラップすることは可能ですが(ボタンのスタイルは必要ありませんが)、セルレベルではラップしたくありません。

また、ビヘイビアーを使用してコマンドをイベントにリンクすることも可能です。しかし、できれば、そのような一般的なタスクの動作に頼る必要はありません。

昔ながらのコマンドデータバインディングを介してこれを行うことは可能ですか?

したがって、1)ユーザーがDataGrid行をクリックします。2)ビューモデルでコマンドが実行されます。

4

2 に答える 2

50

「双方向性」アセンブリと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"

また、DataGridのプロパティへのバインディングを記述SelectedItemし、setアクセサーでコマンドを呼び出すことができますが、上記で示した最初のソリューションの方が優れています。

メインビューモデルからコマンドを呼び出してパス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>
于 2013-03-10T21:07:56.457 に答える
1

@kmatyaszek の回答は .NET 5.0 以降では古くなっていることに注意してください。Microsoft.Xaml.Behaviors代わりに.NET を使用する必要がありMicrosoft.Expression.Interactionsます。

したがって、i名前空間の は次のようになります。

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

詳しくはこちらをご覧ください。

于 2021-11-16T03:32:38.953 に答える