Comment lier une Commande pour double-cliquez sur une ligne dans la grille de données
J'ai développé un WPF UserControl qui est destiné à être utilisé comme une liste de sélection comme suit:
- Une grille de données lié à un CollectionView des entités (par exemple, des Employés)
- Une zone de texte au-dessus de la grille de données qui peut être utilisé pour filtrer les éléments affichés dans la grille de données.
Je veux exposer une Commande qui sera exécutée lorsque l'utilisateur double-clique sur une ligne dans la grille de données. Le récipient peut alors réagir à cette situation en faisant quelque chose avec le SelectedItem dans la grille de données.
Jusqu'à présent, j'ai essayé de gérer le double-clic comme suit:
<DataGrid IsReadOnly="True">
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="... />
</DataGrid.InputBindings>
...
Cependant la double-cliquez sur l'événement encore déclenché lorsque l'utilisateur clique dans la grille de données d'en-tête. Je aimerais être en mesure de le limiter, de sorte que la Commande n'est exécutée lorsque le double clic est dans le corps de la grille de données. Est-il un déclarative façon de le faire?
Mise à JOUR
Je suis juste se familiariser avec WPF et MVVM, et je suis vraiment à la recherche de conseils sur la façon de mettre en œuvre à faible niveau de composants réutilisables comme ça. Tout les conseils généraux seront également reçu avec gratitude et upvoted. Comme il est, je suis en supposant que je veux ce UserControl:
- Exposer une propriété de dépendance "SelectedItem" qui est lié à la grille du SelectedItem
- Exposer un RoutedEvent "ItemDoubleClick" ou similaire qui est déclenché lorsque l'utilisateur double-clique sur une ligne.
- Mettre en œuvre
ICommandSource
et appelCommandHelpers.ExecuteCommandSource(this)
à partir de la ligne double-cliquez sur gestionnaire d'événement.
OriginalL'auteur Joe | 2011-04-27
Vous devez vous connecter pour publier un commentaire.
Si le code n'est pas un problème:
Je doute qu'il y est un moyen facile; vous pouvez diriger des événements pour les commandes à l'aide de
Interactivity
de la Blend SDK et unEventToCommandAction
, le problème est que l'utilisation de l'Interactivité dans un style qui est très compliqué, mais si vous n'avez pas l'esprit la difficulté à il y a des façons.Je suis juste se familiariser avec MVVM et l'envie de l'EMBRASSER pour l'instant, donc je pense que je vais aller faire un code-behind de la solution. Une remarque à propos de votre solution - c'est sans doute la création d'un MouseBinding pour chaque ligne de la il est ajouté à la grille de données - ce que cela pourrait être légèrement inefficace si il y a un grand nombre de lignes? Si je vais le code-behind de l'itinéraire, je me demande s'il serait plus efficace pour gérer le contrôle DataGrid.MouseDoubleClick cas, effectuez un test pour m'assurer que je suis dans une rangée, puis exécuter la commande.
Je me doute que c'est un problème parce que par défaut de la grille de données doit être la virtualisation, c'est à dire uniquement les commandes pour l'affichage des lignes sont en fait générés, donc, en fonction de la taille de votre affichage/fenêtre il ne devrait pas être beaucoup plus que un ou deux cents instancié lignes à la fois. (Vous devez remplir via
ItemsSource
bien sûr.) Vous pouvez ajouter un point d'arrêt dans cette fonction une fois que la fenêtre est chargé, si vous faites défiler la grille, le gestionnaire doit être congédié de nouvelles lignes sont créées.OriginalL'auteur H.B.
Vous pouvez simplement mettre la grille de données dans une Grille et de définir votre InputBindings dans la Grille. Dans le canExecute-définition, vous devez vérifier, si une ligne est sélectionnée. Qui fonctionne pour le Raccourci ainsi, par exemple, une coutume Supprimer-Commande.
Le problème avec ceci est que vous pouvez double-cliquez n'importe où dans la grille pour déclencher la commande une fois qu'une ligne est sélectionnée, et pas seulement sur la ligne elle-même.
OriginalL'auteur Philip