CommandParameters dans ContextMenu dans WPF
J'ai un scénario où j'ai un WPF contrôle TreeView qui a un HierarchicalDataTemplate
de ses éléments. Maintenant à l'intérieur de la HierarchicalDataTemplate
j'ai un Label
et la Label
a un ContextMenu
avec un menuitem pour Delete
. La Suppression de la menuitem est lié à une Commande appelée DeleteCommand
qui est une partie de la classe qui a été définie comme DataType
de la HierarchicalDataTemplate
.
Maintenant, je veux passer la TreeView
de contrôle dans le CommandParameters
de la ContextMenu de Delete
menuitem de DeleteCommand
de sorte que je peux gérer la sélection de la TreeViewItems sur la suppression de l'élément actuellement sélectionné.
Mais si je la lie de la CommandParameters
comme le {Binding ElementName=TreeViewName}
ou que ce soit pour cette question, il est toujours nulle, sauf si l'élément est lié à une propriété dans le DataContext
.
Quelqu'un peut m'aider avec une solution parce que je pense, j'ai essayé toutes les choses possibles comme RelativeSource et AncestorType, etc, mais il est toujours null. Pour moi, ça ressemble à une limitation ou un bug dans le cadre.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Le problème est que le ContextMenu est à la base de sa propre arborescence visuelle, de sorte que toute RelativeSource.FindAncestor liaisons de ne pas aller au-delà de la ContextMenu.
Une solution consiste à utiliser la PlacementTarget propriété pour mettre en place une double liaison à partir de votre Label:
C'est tout à fait hacky, cependant. Vous êtes mieux de réglage de la CommandTarget propriété de votre MenuItem le ContextMenu de PlacementTarget et ayant le gestionnaire de commande sur votre Arborescence. Cela signifie que vous n'aurez pas à passer le TreeView autour de.
ContextMenu.PlacementTarget, est un Label, où la menuitem est hébergé. De Lavel, son parent Treeview est accessible.
Prendre un coup d'oeil à WPF CommandParameter Liaison Problème. Peut-être qu'il peut fournir quelques indications sur ce qu'il se passe.