c# - 在没有 ViewModel 的情况下将静态 ICommand 绑定(bind)到 MenuItem

标签 c# wpf xaml contextmenu commandbinding

我正在尝试将命令绑定(bind)到各种 MenuItemsContextMenu我将与 Button Hook .但是为此,我将所有命令定义为 static在我的 ResourceDictionary 中导入的类(class)中.

public class DesignerCanvas{
    ....
    public static RoutedCommand MyCommand = new RoutedCommand();
    ....
}

在我的 MainWindow.xaml ,我将此命令与我在 MainWindow.xaml.cs 中的实现 Hook 作为:

<CommandBinding Command="{x:Static Designer:DesignerCanvas.MyCommand}"
                    Executed="DoStuff"
                    CanExecute="CanDoStuff" /> 

在我的 ResourceDictionary.xaml , 我有一个 Button我 Hook ContextMenu使用 Triggers :

    <Button x:Name="btnMyButton" Content="Click this">
      <Button.Style>
        <Style TargetType="{x:Type Button}">
          <Style.Triggers>
            <EventTrigger RoutedEvent="Click">
              <EventTrigger.Actions>
                <BeginStoryboard>
                  <Storyboard>
                    <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                      <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                    </BooleanAnimationUsingKeyFrames>
                  </Storyboard>
                </BeginStoryboard>
              </EventTrigger.Actions>
            </EventTrigger>
          </Style.Triggers>
          <Setter Property="ContextMenu">
            <Setter.Value>
              <ContextMenu>
                <MenuItem x:Name="myMenu" Header="MyMenuItem 1">
                  <MenuItem x:Name="menuItem1" Header="MySubMenuItem 1"
Command="{x:Static DesignerItems:DesignerCanvas.MyCommand}">     <<<=== Command Binding
                    <MenuItem.Icon>
                      <Image Source="myImage.png" Width="20"/>
                    </MenuItem.Icon>
                  </MenuItem>
                </MenuItem>
              </ContextMenu>
            </Setter.Value>
          </Setter>
        </Style>
      </Button.Style>
    </Button>

但这似乎不起作用,因为菜单项具有 Command XAML 中指定的内容显示为 disabled也不是CanDoStuff()DoStuff()正在被调试器击中。此外,由于我没有为此使用 ViewModel,因此我无法编写如下内容:

<MenuItem Command="{Binding Path=somePathInViewModel, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" />

我该怎么做,如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

终于让它工作了,只是犯了一些愚蠢的错误!

必须更改 static 命令初始化以将 ContextMenu 作为其所有者

public static RoutedCommand MyCommand = new RoutedCommand("MyCommand", typeof(ContextMenu));

MainWindow.xaml.cs 中,添加了一个方法来注册命令绑定(bind)并从 MainWindow 的构造函数中调用它:

private void InitializeMenuItemsCommands()
    {
        CommandManager.RegisterClassCommandBinding(typeof(ContextMenu), new CommandBinding(DesignerCanvas.TestDialog, OpenTestDialog, CanOpenTestDialog));
    }

最后是 CanExecuteExecuted 事件的处理程序:

private void CanOpenTestDialog(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true; // set if MenuItem is enabled
}

private void OpenTestDialog(object sender, ExecutedRoutedEventArgs e)
{
    // handle the MenuItem click here
}

不必在我的 ResourceDictionary 中为 MenuItem 更改任何内容,所以这里又是 MenuItem 了:

<MenuItem x:Name="menuItem1" Header="MySubMenuItem 1"
Command="{x:Static DesignerItems:DesignerCanvas.MyCommand}">     <<<=== Command Binding
                <MenuItem.Icon>
                  <Image Source="myImage.png" Width="20"/>
                </MenuItem.Icon>
              </MenuItem>

关于c# - 在没有 ViewModel 的情况下将静态 ICommand 绑定(bind)到 MenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873398/

相关文章:

c# - jquery "async = true"调用.net web 服务不异步工作

.net - 重新创建上下文时,wpf mvvm datagrid丢失排序

wpf - 非正方形布局

c# - DockingManager 是否带有用于处理 Anchorables 的内置方法

c++ - 如何在 Canvas 上画一个径向渐变的圆?

c# - 在 variablesizedwrapgrid 代码后面设置 TextBlock 的宽度和高度无法正确显示

c# - 针对 .net 2.0 的 Visual Studio 2008 的静态反射?

c# - 如何访问 Controller 的授权角色?

c# - 如何正确检测主题窗口的角半径

wpf - 创建一个应用程序,对同一 Web 应用程序具有多个 View ,但具有不同的凭据?