当前位置:  开发笔记 > 前端 > 正文

为什么禁用此WPF RoutedCommand绑定Context MenuItem?

如何解决《为什么禁用此WPFRoutedCommand绑定ContextMenuItem?》经验,为你挑选了2个好方法。

我现在仍在摸索WPF,并且无法弄清楚为什么禁用此上下文菜单项:


    
        
            
                
            
        
    


using System.Windows;
using System.Windows.Input;

namespace DisabledMenuItemProblem
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            CommandBindings.Add(new CommandBinding(MyCommands.FooBar, FooExecuted, CanFooExecute));
        }

        public void FooExecuted(object sender, ExecutedRoutedEventArgs e)
        { MessageBox.Show("Foo!"); }

        public void CanFooExecute(object sender, CanExecuteRoutedEventArgs e)
        { e.CanExecute = true; }
    }

    public static class MyCommands
    { 
        public static RoutedCommand FooBar = new RoutedCommand(); 
    }
}

我错过了什么?

令我感到困惑的是,如果我在窗口中抛出一个按钮并将其命令设置为FooBar,它就会起作用,一旦执行它,就会启用上下文菜单!

干杯,克里斯.



1> Muad'Dib..:

这是我使用的一般模式....

首先,将您的命令保存在自己的静态类中,这样可以促进重用等等....

public static class MyCommands
{
    public static RoutedUICommand CmdFoo = new RoutedUICommand("CmdFoo", 
                                                               "CmdFoo", 
                                                               typeof(MyCommands));
}

第二,在control/window/etc中注册命令.你想在它中使用它,通常在构造函数中

public MyControl
{
    public MyControl()
    {
        CommandBindings.Add( 
            new CommandBinding( MyCommands.CmdFoo,   // this is the command object
                                XCutFooCommand,      // execute
                                CanXCuteFooCommand));// can execute?
    }

第三,在控件/窗口/等中创建处理程序.....

  public void CanExecuteRerollCommand(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;  // can this command be executed?
        e.Handled = true;     // has this event been handled?
    }
    public void ExecuteRerollCommand(object sender, ExecutedRoutedEventArgs e)
    {
    // do stuff
    }
}

最后,你的xaml应该是这样的:

    
        
            
        
        
    

注意没有约束力.此外,注意.这是一个参考.... http://www.wiredprairie.us/journal/2007/04/commandtarget_menuitem_context.html

正在禁用的命令在此站点上处理


实际上如果你在XAML中有你的声明,你可以跳过ctor中的CommandBindings.Add()......如果这有意义的话.

2> 小智..:

对于任何寻找这个问题答案的人 - 在浏览互联网之后,我发现最有效的答案是在菜单项的任何声明中包含以下内容,需要其命令被其"所有者"听到.

用外行人的话说; 如果你想通过你正确点击的东西听到你的上下文菜单的命令.添加此代码:

CommandTarget ="{Binding Path = PlacementTarget,RelativeSource = {RelativeSource AncestorType = ContextMenu}}"

例:

    
        
    

这也适用于模板(我发现很多其他解决方案不支持).以下是对其他地方声明的含义的解释(我在解释事情时骇人听闻):

每个FrameworkElement都有一个DataContext,它是一个任意对象.数据绑定的默认源是DataContext.您可以使用RelativeSource.Self来更改绑定到FrameworkElement本身而不是其DataContext的源.因此,RelativeSource部分只是将您从FrameworkElement的DataContext"上升一级"移动到FrameworkElement本身.进入FrameworkElement后,您可以指定其任何属性的路径.如果FrameworkElement是Popup,它将具有PlacementTarget属性,该属性是Popup相对于其定位的另一个FrameworkElement.

简而言之,如果你有一个相对于TextBox放置的Popup,那么该表达式将Popup的DataContext设置为TextBox,结果Popped正文中的某个地方{Binding Text}将绑定到TextBox的文本.

老实说,我希望这些信息可以帮助那些刚接触WPF的人,这个周末我经历过的头痛......虽然它确实教会了我很多!

史蒂夫

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有