WPF DataGrid: CommandBinding a un doppio clic anziché utilizzare eventi



Answers

Nessuna necessità di comportamenti allegati o sottoclassi DataGrid personalizzate qui.

Nel tuo DataGrid , ItemsSource a un ICollectionView . Il trucco qui è impostare IsSynchronizedWithCurrentItem="True" che significa che la riga selezionata sarà l'elemento corrente.

La seconda parte del trucco consiste nel associare CommandParameter all'elemento corrente con la sintassi della barra in avanti.

Quando si fa doppio clic su una riga, il comando verrà eseguito con la riga cliccata come argomento.

<DataGrid
    ItemsSource="{Binding CollectionView}"
    IsSynchronizedWithCurrentItem="True">
    <DataGrid.InputBindings>
        <MouseBinding
            MouseAction="LeftDoubleClick"
            Command="{Binding DoubleClickCommand}"
            CommandParameter="{Binding CollectionView/}"/>
    </DataGrid.InputBindings>
</DataGrid>

Ecco come apparirà una versione (semplificata) del modello di visualizzazione:

class MyViewModel
{
    public ICollectionView CollectionView { get; set; }

    public ICommand DoubleClickCommand { get; set; }
}
Question

So come utilizzare l'evento MouseDoubleClick con il mio DataGrid per acquisire il valore selezionato, ma come si dovrebbe utilizzare invece i binding di comandi? In questo modo il mio ViewModel può gestire la logica.

Finora ho il seguente:

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick"
          ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None">

Voglio sbarazzarmi di MouseDoubleClick e sostituirlo in modo appropriato.




Usa questa libreria

Associazione del campione all'evento datagrid:

<DataGrid xmlns:command="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior"
    command:CommandBehavior.Event="MouseDoubleClick"
    command:CommandBehavior.Command="{Binding TestCommand}" />

Ma questo codice è migliore, perché solleva solo sui clic di riga:

<DataGrid>
    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Setter Property="command:CommandBehavior.Event" Value="MouseDoubleClick"/>
            <Setter Property="command:CommandBehavior.Command" Value="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
        </Style>
    </DataGrid.Resources>
</DataGrid>