2009-12-10 12 views
5

Cercando di capire come utilizzare EventToCommand per impostare un gestore di doppio clic del datagrid per le righe. Il comando vive nel modellabile per ogni riga. Solo che il molto della mia esperienza, dal momento che non ho ancora usato le interazioni.MvvmLight EventToCommand e WPFToolkit DataGrid doppio clic

Grazie.

Avrei usato il tag mvvmlight, ma non ho ancora abbastanza rep per creare nuovi tag.

+0

Ho aggiunto il tag mvvm-light per te. Questo è quello ufficiale da utilizzare per il toolkit MVVM Light di Laurent Bugnion. – dthrasher

risposta

11

Questa sarebbe la soluzione se il comando risiede sul "GridVieModel" e non sul "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> 

Si potrebbe creare un rowview dal momento che la fila ha anche un proprio ViewModel e utilizzare l'evento MouseDoubleClick di un elemento figlio della fila (contenitore) in rowview.

O si crea un convertitore per il vostro comando vincolante:

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

Il convertitore poi avrebbe controllato se il selectedItem è del tipo richiesto di restituire il comando (Qualcosa di simile ISelectCommandable con una proprietà RelayCommand)

+0

Torn ... Non avrò l'opportunità di provarlo a lungo, ma non voglio lasciarlo senza risposta. Sembra giusto in teoria, ma volevo davvero qualcosa in cui il comando fosse su RowViewModel. O forse stai insinuando che DataGrid non fornisce un doppio clic che supporta l'identificazione della riga coinvolta? – Thomas

+0

L'idea alla base del convertitore era che il convertitore lancia l'oggetto SelectedItem e restituisce il comando. In questo modo avresti chiamato il comando sul RowViewModel (non sono sicuro se ne hai bisogno o se puoi fare qualcosa come SelectedItem.SelectCommand) Per identificare se una riga è stata doppiamente richiesta, avresti bisogno di EventArgs. Ma puoi restituirlo con il toolkit mvvm-light. – CodeWeasel

+0

K, grazie per la sintassi di esempio. Risponderò di nuovo se mai riuscirò a provare questo metodo. – Thomas

4

Nel caso qualcuno viene a cercare qui e si chiede come ho finito per farlo 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 
} 

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

Ho appena visto questo e senza passare troppo tempo a guardare i dettagli: non stai realizzando solo un EventToCommand Light qui? – carlsb3rg

+0

Non so se potrei chiamarlo così, poiché questo è molto specifico per fare doppio clic, ma sicuramente. – Thomas

Problemi correlati