2009-12-10 10 views
5

Versuchen Sie herauszufinden, wie EventToCommand verwendet wird, um einen DataGrid-Doppelklick-Handler für Zeilen festzulegen. Der Befehl lebt im Viewmodel für jede Zeile. Nur dass viel aus meiner Erfahrung, da ich Interaktionen noch nicht verwendet habe.MvvmLight EventToCommand und WPFToolkit DataGrid doppelklicken Sie auf

Danke.

Ich hätte mvvmlight-Tag verwendet, aber ich habe noch nicht genug rep genug, um neue Tags zu machen.

+0

Ich habe das mvvm-light-Tag für Sie hinzugefügt. Das ist die offizielle Version von Laurent Bugnions MVVM Light Toolkit. – dthrasher

Antwort

11

Dies wäre die Lösung, wenn der Befehl auf dem "GridVieModel" und nicht auf dem "RowViewModel" lebt.

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

könnten Sie eine rowview schaffen, da auch die Reihe sein eigenes Viewmodel hat und das Mousedoubleclick-Ereignis eines Kind Element der Reihe (Container) im rowview verwenden.

Oder Sie erstellen einen Konverter für Ihre Befehlsbindung:

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

Der Konverter dann würde prüfen, ob die selectedItem des gewünschten Typs ist der Befehl (So etwas wie ISelectCommandable mit einem RelayCommand Property) zurückzukehren

+0

Zerrissen ... Ich werde nicht die Gelegenheit haben, das lange auszuprobieren, aber ich möchte es nicht unbeantwortet lassen. Es sieht in der Theorie richtig aus, aber ich wollte wirklich etwas, wo der Befehl im RowViewModel war. Oder implizieren Sie, dass DataGrid keinen Doppelklick unterstützt, der die Identifizierung der betroffenen Zeile unterstützt? – Thomas

+0

Die Idee hinter dem Konverter war, dass der Konverter das SelectedItem konvertiert und den Befehl zurückgibt. Auf diese Weise hätten Sie den Befehl für das RowViewModel aufgerufen (ich bin mir nicht sicher, ob Sie es überhaupt benötigen oder SelectedItem.SelectCommand) Um zu identifizieren, ob eine Zeile doppelt geklickt wurde, benötigen Sie EventArgs. Aber Sie können das mit dem mvvm-light Toolkit zurückgeben. – CodeWeasel

+0

K, danke für die Beispiel-Syntax. Ich werde wieder antworten, wenn ich jemals dazu komme, diese Methode auszuprobieren. – Thomas

4

Falls jemand kommt suchen hier und fragt sich, wie ich es 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 
} 

In meiner xAML tun endete:

<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

Ich habe das gesehen und ohne zu viel Zeit mit Details zu verbringen: Implementieren Sie hier nicht wirklich ein EventToCommand Light? – carlsb3rg

+0

Weiß nicht, ob ich das überhaupt so nennen könnte, da dies sehr spezifisch für Doppelklick ist, aber sicher. – Thomas

Verwandte Themen