web-dev-qa-db-ja.com

DataGrid bindコマンドと行選択

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

セルのコンテンツをボタンでラップすることは可能です(ただし、ボタンのスタイルは必要ありません)。ただし、セルレベルでそれを行いたくありません。

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

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

つまり、1)ユーザーがDataGrid行をクリックします。2)ビューモデルのコマンドが起動されます。

17
Bent Rasmussen

"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>
44
kmatyaszek