在WPF中为多个控件重用上下文菜单

在WPF中为多个控件重用上下文菜单,wpf,parameters,contextmenu,Wpf,Parameters,Contextmenu,我有三个树视图控件,它们包含不同的(但大部分是相似的数据),因此,就用户而言,每个级别可以采取的操作是相同的,但类型不同(这是作为开发人员我必须担心的)。我想做的是重用这个上下文菜单并向它传递一个类型(或者能够检索它),然后将该类型传递给实际执行的函数 因此,我们可以有一个共同的措辞这里有一些代码: <UserControl x:Class="ucControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat

我有三个树视图控件,它们包含不同的(但大部分是相似的数据),因此,就用户而言,每个级别可以采取的操作是相同的,但类型不同(这是作为开发人员我必须担心的)。我想做的是重用这个上下文菜单并向它传递一个类型(或者能够检索它),然后将该类型传递给实际执行的函数

因此,我们可以有一个共同的措辞这里有一些代码:

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


在本例中,我希望每个尺寸、品牌和颜色都具有相同的上下文菜单,但如果在“尺寸”树视图中调出上下文菜单,我将需要向表中添加一组类型大小。我这样做可能吗?我试图避免制作三个上下文菜单,这显然是一种方法。

我知道只有一种方法可以实现这一点, 在CommandHandler中,您需要检查哪个树调用了它

在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
}

希望这有帮助

这应该行得通,我必须在某些方法中从元素中获取id。