2009-02-02 10 views
11

Tengo un escenario en el que tengo un control TreeView de WPF que tiene un HierarchicalDataTemplate para sus elementos. Ahora dentro del HierarchicalDataTemplate, tengo un Label y el Label tiene un ContextMenu con un elemento de menú para Delete. El elemento de menú Eliminar está vinculado a un comando llamado DeleteCommand que forma parte de la clase que se ha establecido como DataType del HierarchicalDataTemplate.Parámetros de mandato en ContextMenu en WPF

Ahora, yo quiero pasar el control TreeView en el CommandParameters del ContextMenu de Delete menuitem de DeleteCommand para que pueda manejar la selección de los TreeViewItems sobre la supresión del elemento actualmente seleccionado.

Pero si vinculo el CommandParameters como el {Binding ElementName=TreeViewName} o lo que sea, es siempre nulo a menos que el elemento encuadernado sea una propiedad en el DataContext.

¿Alguien puede ayudarme con una solución porque creo que he intentado todas las cosas posibles, como RelativeSource y AncestorType, etc., pero siempre es nula. Para mí, parece una limitación o un error en el marco.

Respuesta

17

El problema es que el ContextMenu está en la raíz de su propio árbol visual, por lo que cualquier enlace RelativeSource.FindAncestor no irá más allá del ContextMenu.

Una solución es utilizar la propiedad PlacementTarget para establecer una unión de su etiqueta de dos etapas:

<Label Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={ 
    x:Type TreeView}}}"> 
    <Label.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Delete" Command="{x:Static local:Commands.DeleteCommand}" 
       CommandParameter="{Binding PlacementTarget.Tag, RelativeSource={ 
       RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/> 
     </ContextMenu> 
    </Label.ContextMenu> 
</Label> 

Esto es bastante hacky, sin embargo. Será mejor que establezca la propiedad CommandTarget de su MenuItem en PlacementTarget de ContextMenu y que tenga el controlador de comando en su TreeView. Esto significa que no tendrá que pasar el TreeView.

+3

manera fácil: JoanComasFdz

+1

@JoanComas: después de probar todos los demás sin éxito (ni entender lo que significaba todo aquello con FindAncestors, etc.), su forma Way Way funciona perfectamente. Gracias. – joedotnot

+2

El comentario de @JoanComasFdz es realmente de ayuda. Puedo aplicar 'CommandParameter =" {Binding} "' simplemente. – Youngjae

0
<MenuItem Header="..." 
      Command="{Binding Path=...}" 
      CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type ContextMenu}}}"> 
</MenuItem> 

ContextMenu.PlacementTarget, es Etiqueta, donde se encuentra el menuitem. Desde Lavel, su padre Treeview es accesible.

1
<ContextMenu> 
    <MenuItem Header="Edit Item" 
        Command="{Binding EditItemCommand, Mode=OneWay}" 
        CommandParameter="{Binding Path=UIElement.(views:DataGridView.SelectedItems), RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" /> 
<ContextMenu> 
Cuestiones relacionadas