2009-12-10 10 views
5

Intentando averiguar cómo usar EventToCommand para establecer un controlador de doble clic de cuadrícula de datos para las filas. El comando vive en el modelo de vista para cada fila. Solo que está fuera de mi experiencia, ya que todavía no he usado interacciones.MvvmLight EventToCommand y WPFToolkit DataGrid haga doble clic en

Gracias.

Habría usado la etiqueta mvvmlight, pero aún no tengo la suficiente reputación como para crear nuevas etiquetas.

+0

He añadido la etiqueta mvvm-light para usted. Esa es la oficial para usar para el juego de herramientas MVVM Light de Laurent Bugnion. – dthrasher

Respuesta

11

Esta sería la solución si el comando vive en el "GridVieModel" y no en el "RowViewModel".

<Window...  
     ...xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"> 
     <dg:DataGrid x:Name="dg"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick"> 
          <GalaSoft_MvvmLight_Command:EventToCommand CommandParameter="{Binding SelectedItem, ElementName=dg}" Command="{Binding Path=SelectCommand, Mode=OneWay}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
      </dg:DataGrid> 
    </Window> 

Se puede crear un rowview desde la fila también tiene su propio modelo de vista y utilizar el evento MouseDoubleClick de un elemento secundario de la fila (contenedor) en el rowview.

O crear un convertidor para su comando de unión:

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding SelectedItem, ElementName=dg, Mode=OneWay, Converter=...}"/> 

el convertidor lo comprobaría si el selectedItem es del tipo requerido para devolver el comando (Algo así como ISelectCommandable con una propiedad RelayCommand)

+0

Torn ... No tendré la oportunidad de probar esto durante mucho tiempo, pero no quiero dejarlo sin respuesta. Se ve bien en teoría, pero realmente quería algo donde el comando estaba en RowViewModel. O tal vez esté dando a entender que DataGrid no proporciona un doble clic que permita identificar la fila involucrada. – Thomas

+0

La idea detrás del convertidor era que el convertidor arroja el elemento seleccionado y devuelve el comando. De esa manera, habría llamado al comando en RowViewModel (no estoy seguro de si lo necesita o si puede hacer algo como SelectedItem.SelectCommand) Para identificar si una fila se ha cliqueado doble, necesitará los EventArgs. Pero puede devolverlo con el kit de herramientas mvvm-light. – CodeWeasel

+0

K, gracias por la sintaxis de la muestra. Volveré a responder si alguna vez consigo probar este método. – Thomas

4

En caso de que alguien viene a buscar aquí y se pregunta cómo acabé haciéndolo w/o EventToCommand

public class DataGridAttachedBehaviors 
{ 
    #region DoubleClick 

    public static DependencyProperty OnDoubleClickProperty = DependencyProperty.RegisterAttached(
     "OnDoubleClick", 
     typeof(ICommand), 
     typeof(DataGridAttachedBehaviors), 
     new UIPropertyMetadata(DataGridAttachedBehaviors.OnDoubleClick)); 

    public static void SetOnDoubleClick(DependencyObject target, ICommand value) 
    { 
     target.SetValue(DataGridAttachedBehaviors.OnDoubleClickProperty, value); 
    } 

    private static void OnDoubleClick(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var element = target as Control; 
     if (element == null) 
     { 
     throw new InvalidOperationException("This behavior can be attached to a Control item only."); 
     } 

     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
     element.MouseDoubleClick += MouseDoubleClick; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
     element.MouseDoubleClick -= MouseDoubleClick; 
     } 
    } 

    private static void MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UIElement element = (UIElement)sender; 
     ICommand command = (ICommand)element.GetValue(DataGridAttachedBehaviors.OnDoubleClickProperty); 
     command.Execute(null); 
    } 

    #endregion DoubleClick 

    #region SelectionChanged 
    //removed 
    #endregion 
} 

En mi xaml:

<dg:DataGrid.RowStyle> 
    <Style BasedOn="{StaticResource DataGridDemoRowStyle}"   
      TargetType="{x:Type dg:DataGridRow}"> 
     <Setter Property="skins:DataGridAttachedBehaviors.OnDoubleClick" 
       Value="{Binding Recall}" /> 
    </Style> 
</dg:DataGrid.RowStyle> 
+0

Acabo de ver esto y sin perder demasiado tiempo mirando los detalles: ¿realmente no está implementando un EventToCommand Light aquí? – carlsb3rg

+0

No sé si podría llamarlo así, ya que esto es muy específico para hacer doble clic, pero seguro. – Thomas

Cuestiones relacionadas