我有三个树视图控件,它们包含不同的(但大多数是相似的数据),因此可以在每个级别采取的操作就用户而言是相同的,但是它们的类型不同(这是作为开发人员我不得不担心的事情。我喜欢做的是重用这个上下文菜单并向其传递一个类型(或者能够检索它),然后该类型将被传递给实际的Executed函数。
这样我们就可以在这里找到一些常用的代码:
<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>
在这个例子中,我希望Size,Brand和Color中的每一个都具有相同的ContextMenu,但是如果在Size TreeView中提取了Context Menu,我将需要添加一个类型为Size的组到我的表。这可能就像我这样做吗?我试图避免制作三个ContextMenus,这显然是一种方法。
答案 0 :(得分:2)
我知道只有一种方法可以实现这一目标, 在CommandHandler中,您需要检查哪个Tree已经调用了它。
在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
}
希望这会有所帮助!!