具有多种目标类型的WPF命令

时间:2011-01-11 00:00:54

标签: wpf command

我对使用不同目标类型的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基类继承,但这似乎仍然是错误的。)

1 个答案:

答案 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"(如果适用于您)。