2009-12-14 3 views
2

J'ai trois contrôles d'arborescence qui contiennent des données différentes (mais principalement similaires), par conséquent les actions qui peuvent être prises à chaque niveau sont les mêmes pour l'utilisateur, mais différent dans leur type (ce qui est quelque chose que je dois s'inquiéter en tant que développeur). Ce que je voudrais comme à faire est de réutiliser ce menu contextuel et lui passer un type (ou être capable de le récupérer) et ensuite le type serait passé à travers à la fonction exécutée réelle.Réutilisation d'un ContextMenu pour plusieurs contrôles dans WPF

Afin que nous puissions avoir un verbage commun est ici un code:

<UserControl x:Class="ucControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:LocalNamespace" 
Name="ucControl" 
xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
Background="LightGray"> 
<UserControl.Resources> 
    <ContextMenu x:Key="GroupMenu"> 
     <MenuItem Header="Add Group" Command="New"/> 
     <MenuItem Header="Rename Group" Command="local:CustomCommands.RenameGroup"/> 
     <MenuItem Header="Delete Group" Command="Delete"/> 
     <Separator/> 
     <MenuItem Header="Change Contents of Group" Command="local:CustomCommands.EditGroupContents"/> 
    </ContextMenu> 
</UserControl.Resources> 
<UserControl.CommandBindings> 
    <CommandBinding CanExecute="CanAddGroup" Command="New" Executed="AddGroup"/> 
    <CommandBinding Command="local:CustomCommands.RenameGroup" CanExecute="CanRename" Executed="RenameGroup"/> 
    <CommandBinding Command="local:CustomCommands.EditGroupContents" CanExecute="CanEditGroupContents" Executed="EditGroupContents"/> 
</UserControl.CommandBindings> 
<TabControl Name="tcTabs"> 
    <TabItem Header="Size" Name="tiSize"> 
     <TreeView Name="tvSizeGroup" ContextMenu="{StaticResource GroupMenu}"/> 
    </TabItem> 
    <TabItem Header="Brand" Name="tiBrand"> 
     <TreeView Name="tvBrandGroup" ContextMenu="{StaticResource GroupMenu}"/> 
    </TabItem> 
    <TabItem Header="Color" Name="tiColor"> 
     <TreeView Name="tvColorGroup" ContextMenu="{StaticResource GroupMenu}"/> 
    </TabItem> 
</TabControl> 

Dans cet exemple, je voudrais que chacun de taille, marque et couleur pour avoir la même ContextMenu, mais si le menu contextuel est tiré dans la taille TreeView, je vais devoir ajouter un groupe de type taille à ma table. Est-ce possible comme je le fais? J'essaie d'éviter de créer trois ContextMenus, ce qui serait évidemment un moyen de le faire.

Répondre

2

Il n'y a qu'une seule façon de le faire, Dans le CommandHandler, vous devez vérifier quel arbre a appelé cela.

essayer dans votre CommandHandler:

MenuItem mnu = sender as MenuItem; 
TreeView tv = null; 
if(mnu!=null) 
{ 
    tv = ((ContextMenu)mnu.Parent).PlacementTarget as TreeView; 
} 
if(tv.Name=="tvSizeGroup") 
{ 
    //add group of Size 
} 
if(tv.Name=="tvBrandGroup") 
{ 
    //add group of Brand 
} 

Hope this helps !!

+0

Cela devrait fonctionner, j'allais devoir obtenir un ID de l'élément de toute façon dans certaines des méthodes. –

Questions connexes