wpf - 如何从另一个窗口的主窗口级别访问命令?

标签 wpf wpf-controls binding

我试图在另一个窗口中访问在 MainWindow.xaml 中定义的命令。我只能让这些命令的标题变灰。我想知道应该做什么才能获得完全访问权限。

命令示例:

public partial class MainWindow : Window
{
    public static RoutedUICommand AddCommand1 = new RoutedUICommand("Command ", "command1", typeof(MainWindow));

    public MainWindow()
    {
        InitializeComponent();
        this.CommandBindings.Add(new CommandBinding(AddCommand1, AddCommand1Executed));
    }

    private void AddCommand1Executed(object sender, ExecutedRoutedEventArgs e)
    {
        AddNewItem picker = new AddNewItem();
        picker.ShowDialog();
    }

我通过数据绑定(bind)访问这些命令:

<Menu x:Name="TaskMenuContainer"><MenuItem x:Name="menuItem" Header="TASKS" ItemsSource="{Binding}" Template="{DynamicResource TaskMenuTopLevelHeaderTemplateKey}">
<MenuItem.ItemContainerStyle>
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding}" />
        <Setter Property="Header" Value="{Binding Text, RelativeSource={RelativeSource Self}}" />
        <Setter Property="CommandTarget" Value="{Binding RelativeSource={RelativeSource Self}}"/>
    </Style>
</MenuItem.ItemContainerStyle>

这些命令在通过框架加载到 MainWindow.xaml 中的页面中起作用。但是,如果我有不属于 MainWindow.xaml 的弹出窗口,这些命令只会变灰并且不再起作用(无法执行)。非常感谢任何建议!

最佳答案

您定义命令的方式是为特定窗口定义的。如果你想全局处理命令,在应用层,你可以使用CommandManager.RegisterClassCommandBinding:

首先,在一个单独的静态类中定义你的命令:

public static class GlobalCommands
{
    public static RoutedUICommand AddCommand1 = new RoutedUICommand("Command ", "command1", typeof(MainWindow));
}

然后,在您的窗口或任何您想放置命令逻辑的地方,注册命令处理程序:

public partial class MainWindow : Window
{
    static MainWindow()
    {
       CommandManager.RegisterClassCommandBinding(typeof(Window), new CommandBinding(GlobalCommands.AddCommand1, AddCommand1Executed, CanAddExecute));
    }

    private static void AddCommand1Executed(object sender, ExecutedRoutedEventArgs e)
    {
        AddNewItem picker = new AddNewItem();
        picker.ShowDialog();
    }
}

并且在您的菜单样式中,您应该将绑定(bind)更改为 x:Static:

<Setter Property="Command" Value="{x:Static my:GlobalCommands.AddCommand1}" />


路由命令时,在检查 UI 中每个事件元素中的命令绑定(bind)时,还将检查为每个元素的类注册的绑定(bind)。通过在此处注册绑定(bind),您可以使类的每个实例都能够处理特定命令。

因此,在上面的示例中,使用了 Window 类型,这将导致路由在任何 Window,一旦路由在搜索命令绑定(bind)时到达该实例。

例如,您可以改为将处理限制到 Window 的特定子类,这样命令将只绑定(bind)到该子类的实例中。或者您可以使用其他一些 UI 元素类型,以便该特定类型元素的存在会导致事件得到处理。只需根据您的特定需求适本地设置已注册命令绑定(bind)的拥有类型。

关于wpf - 如何从另一个窗口的主窗口级别访问命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950886/

相关文章:

c# - 绑定(bind)不适用于数据模板中的数据模板

具有数据绑定(bind)的 C# 文本框未更新

c# - WPF ListView GridView 单元格样式和绑定(bind)

c# - 什么时候应该在 WPF 中使用依赖属性?

wpf - GetTemplateChild 总是返回 null

wpf - 将资源绑定(bind)到自定义控件属性

wpf - 如何在 WPF 中设置/重置三态复选框值

c# - 如何通过 WPF 中的 HitTesting 使用坐标/点获取 TreeViewItem?

c# - MVVM WPF 按钮命令绑定(bind) - RelayCommand

Silverlight MVVM 绑定(bind)似乎不起作用