我对使用不同目标类型的WPF命令感到有些困惑。
所以如果我定义一个命令
<Window.CommandBindings>
<CommandBinding Command="Copy"
Executed="CopyCmdExecuted"
CanExecute="CopyCmdCanExecute"/>
</Window.CommandBindings>
现在我在上下文菜单中使用它:
<ContextMenu Name="FolderContextMenu">
<MenuItem Command="Copy"/>
</ContextMenu>
我有一个处理命令的方法:
private void CopyCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
}
我在一个普通的菜单中使用它:
<Menu Name="editMenu">
<MenuItem Command="Copy"/>
</Menu>
我理解这一点没有问题。但是如果目标对象是不同的类型,我有点困惑。
假设我有文件夹和用户,两者都有一个带有New命令的上下文菜单(以及菜单栏编辑菜单,它也有New命令)。
执行New时,无论是文件夹还是用户,都会执行CopyCmdExecuted。那么,我现在应该对目标进行解复用吗?像
这样的东西 private void CopyCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
if(sender is User)
// Do copy user stuff
if(sender is Folder)
// Do copy folder stuff
}
如果我希望复制大量数据类型,那似乎有点烦人。我在这里不明白吗?
(显然,我可以让文件夹和用户从带有DoCopy的Copiable基类继承,但这似乎仍然是错误的。)
答案 0 :(得分:2)
您可以在调用CommandParameter
时发送Command
,以指明您要应用的命令的含义。这是两个TextBlock
元素:
<Grid>
<StackPanel>
<TextBlock Name="textBlock1" Text="File">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem
Command="Copy"
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
<TextBlock Name="textBlock2" Text="Folder">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem
Command="Copy"
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
</Grid>
和这个代码隐藏:
private void CopyCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
var text = (e.Parameter as TextBlock).Text;
Debug.WriteLine("Text = " + text);
}
使用该参数确定上下文菜单适用的TextBlock
。您也可以使用字符串"File"
和"Folder"
(如果适用于您)。