Как получить доступ к команде с уровня MainWindow в другом окне? - PullRequest
3 голосов
/ 10 февраля 2011

Я пытаюсь получить доступ к командам, которые определены в 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>

Эти команды работают на страницах, которые загружаются в MainWindow.xaml через фрейм.Однако, если у меня есть всплывающее окно, которое не является частью MainWindow.xaml, эти команды только отображаются серым цветом и больше не работают (не могут быть выполнены).Любой совет высоко ценится!

1 Ответ

3 голосов
/ 10 февраля 2011

Как вы определяете команду, вы определяете ее для определенного окна.Если вы хотите обрабатывать команду глобально, на уровне приложения вы можете использовать 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}" />

Когда команда маршрутизируется, при проверке привязок команд в каждом активном элементе в пользовательском интерфейсе также проверяются привязки, зарегистрированные для класса каждого элемента.Регистрируя здесь привязку, вы можете сделать так, чтобы каждый экземпляр класса мог обрабатывать определенную команду.

Итак, в приведенном выше примере используется тип Window, и это приведет к маршрутизациинайдите привязку команды в любом экземпляре Window, как только маршрутизация достигнет этого экземпляра в поиске привязки команды.

Вместо этого вы можете, например, ограничить обработку доопределенный подкласс Window, так что команда будет связана только в экземпляре этого подкласса.Или вы можете использовать какой-либо другой тип элемента пользовательского интерфейса, чтобы присутствие этого определенного типа элемента вызывало обработку события.Просто установите тип владельца для зарегистрированной привязки команды в соответствии с вашими потребностями.

...