如何从另一个窗口中的MainWindow级别访问命令?

时间:2011-02-09 21:45:52

标签: 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();
    }

我通过数据绑定以样式访问这些命令:

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

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

1 个答案:

答案 0 :(得分:3)

您定义命令的方式是为特定窗口定义它。如果要全局处理该命令,则可以在应用程序级别使用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();
    }
}

在菜单样式中,您应该将绑定更改为x:Static

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


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

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

例如,您可以将处理限制为Window的特定子类,以便命令仅绑定在该子类的实例中。或者您可以使用其他一些UI元素类型,以便该特定类型的元素的存在将导致事件被处理。只需根据您的特定需要为已注册的命令绑定设置拥有类型。