我正在尝试将命令绑定(bind)到各种 MenuItems
在ContextMenu
我将与 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));
}
最后是 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
}
不必在我的 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/