wpf datagrid double-click commandbinding

WPF DataGrid: CommandBinding con un doble clic en lugar de usar Eventos



double-click (5)

¿Has revisado esta publicación , proporciona una solución completa ...

Sé cómo usar el evento MouseDoubleClick con mi DataGrid para tomar el valor seleccionado, pero ¿cómo podría uno usar enlaces de comando en su lugar? De esa forma mi ViewModel puede manejar la lógica.

Hasta ahora tengo lo siguiente:

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

Quiero deshacerme de MouseDoubleClick y reemplazarlo apropiadamente.


Usa esta biblioteca

Ejemplo de enlace al evento de cuadrícula de datos:

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

Pero este código es mejor, porque solo aumenta los clics de fila:

<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>


O bien, podrías crear una clase derivada

public class CustomDataGrid : DataGrid { public ICommand DoubleClickCommand { get { return (ICommand)GetValue(DoubleClickCommandProperty); } set { SetValue(DoubleClickCommandProperty, value); } } // Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc... public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(CustomDataGrid), new UIPropertyMetadata()); public CustomDataGrid() : base() { this.PreviewMouseDoubleClick += new MouseButtonEventHandler(CustomDataGrid_PreviewMouseDoubleClick); } void CustomDataGrid_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { if (DoubleClickCommand != null) { DoubleClickCommand.Execute(null); } } }

y en XAML simplemente se une al comando recién creado

<CustomDataGrid DoubleClickCommand="{Binding DoubleClickCommand}">


Otra solución es agregar enlaces de entrada y vincular el elemento seleccionado a una propiedad para que sepa cuál fue seleccionado:

<DataGrid SelectedItem="{Binding SelectedItem}"> <DataGrid.InputBindings> <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/> </DataGrid.InputBindings> </DataGrid>


No hay necesidad de comportamientos adjuntos o subclases de DataGrid personalizadas aquí.

En su DataGrid , enlace ItemsSource a un ICollectionView . El truco aquí es establecer IsSynchronizedWithCurrentItem="True" que significa que la fila seleccionada será el elemento actual.

La segunda parte del truco es vincular CommandParameter al elemento actual con la sintaxis de barra diagonal.

Cuando se hace doble clic en una fila, el comando se ejecutará con la fila cliqueada como argumento.

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

Así es como se vería una versión (simplificada) del modelo de vista:

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