繁体   English   中英

在没有ViewModel的情况下将静态ICommand绑定到MenuItem

[英]Binding a static ICommand to MenuItem without a ViewModel

我正在尝试将命令绑定到ContextMenu中的各种MenuItems ,我将使用Button 但为此,我将所有命令定义为我在ResourceDictionary导入的类中的static

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

在我的MainWindow.xaml ,我使用MainWindow.xaml.cs中的实现挂钩此命令:

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

在我的ResourceDictionary.xaml ,我有一个Button ,我使用Triggers挂钩ContextMenu

    <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>

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

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

我怎么能这样做,任何帮助将不胜感激。 提前致谢。

你实际上在代码中做得很好但是在WPF中几乎没有关于ContextMenus的隐藏错误/功能。 那些坏男孩缺乏WPF通常的功能。 ContextMenu实际上只是WPF中每个控件可用的转储属性,一旦用户触发右键单击,它就会将其项列表注入VisualTree。

要解决您的问题,请不要在Style中设置ContextMenu,也不要在Window级别设置CommandBinding,而是在ContextMenu的级别上设置它。

虽然最重要的是没有在Style中设置ContextMenu!

编辑:

将ContextMenu远离Style,并将CommandBinding设置为:

<ContextMenu>
    <ContextMenu.CommandBindings>
        <CommandBinding Command="foo:MyCommands.CmdFoo" 
                        CanExecute="CanExecuteRerollCommand" 
                        Executed="ExecuteRerollCommand" />
    </ContextMenu.CommandBindings>
    <MenuItem Header="Reroll"  Command="foo:MyCommands.CmdFoo"/>
</ContextMenu>

终于搞定了,做了一些愚蠢的错误!

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

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

MainWindow.xaml.cs ,添加了一个注册命令绑定的方法,并从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
}

DID不必在我的ResourceDictionaryMenuItem更改任何内容,所以这里再次是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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM