ユーザーがDataGridで行を選択したときにコマンドを実行したい。
セルのコンテンツをボタンでラップすることは可能です(ただし、ボタンのスタイルは必要ありません)。ただし、セルレベルでそれを行いたくありません。
また、ビヘイビアーを使用してコマンドをイベントにリンクすることも可能です。しかし、できれば私はそのような一般的なタスクの振る舞いに頼る必要はないはずです。
プレーンな古いコマンドのデータバインディングを介してこれを行うことは可能ですか?
つまり、1)ユーザーがDataGrid行をクリックします。2)ビューモデルのコマンドが起動されます。
"Interactivity"アセンブリと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>