2009-12-10 6 views
5

Vous essayez de comprendre comment utiliser EventToCommand pour définir un gestionnaire de double-clique DataGrid pour les lignes. La commande vit dans le viewmodel pour chaque ligne. Juste que beaucoup de mon expérience, puisque je n'ai pas encore utilisé les interactions.MvvmLight EventToCommand et WPFToolkit DataGrid double-cliquez sur

Merci.

J'aurais utilisé la balise mvvmlight, mais je n'ai pas encore suffisamment de rep pour créer de nouvelles balises.

+0

J'ai ajouté l'étiquette mvvm-light pour vous. C'est la version officielle à utiliser pour MVVM Light de Laurent Bugnion. – dthrasher

Répondre

11

Ceci serait la solution si la commande se trouvait sur le "GridVieModel" et non sur le "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> 

Vous pouvez créer un rowview depuis la ligne a également son propre viewmodel et utiliser l'événement MouseDoubleClick d'un élément enfant de la ligne (conteneur) dans le rowview.

Ou vous créez un convertisseur pour votre commande de liaison:

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

Le convertisseur puis vérifierait si le selectedItem est du type requis pour retourner la commande (Quelque chose comme ISelectCommandable avec une propriété RelayCommand)

+0

Déchiré ... Je n'aurai pas l'occasion de l'essayer pendant longtemps, mais je ne veux pas le laisser sans réponse. Il semble correct en théorie, mais je voulais vraiment quelque chose où la commande était sur le RowViewModel. Ou peut-être que vous laissez entendre que DataGrid ne fournit pas un double clic qui permet d'identifier la ligne impliquée? – Thomas

+0

L'idée derrière le convertisseur était, que le convertisseur jette le SelectedItem et renvoie la commande. De cette façon vous auriez appelé la commande sur le RowViewModel (je ne suis pas vraiment sûr si vous en avez besoin ou si vous pouvez faire quelque chose comme SelectedItem.SelectCommand) Pour identifier si une ligne a été doubleclicked vous auriez besoin de EventArgs. Mais vous pouvez le retourner avec la boîte à outils mvvm-light. – CodeWeasel

+0

K, merci pour l'exemple de syntaxe. Je vais répondre à nouveau si jamais j'essaie d'essayer cette méthode. – Thomas

4

en cas où quelqu'un vient chercher ici et se demande comment je fini par faire 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 
} 

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

Juste vu ceci et sans passer trop de temps à regarder les détails: n'êtes-vous pas simplement en train d'implémenter un EventToCommand Light ici? – carlsb3rg

+0

Je ne sais pas si je pourrais même l'appeler comme ça, car c'est très spécifique au double-clic, mais c'est sûr. – Thomas

Questions connexes