[英]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));
}
最后是CanExecute
和Executed
事件的处理程序:
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不必在我的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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.