Есть ли способ псевдоним команды в WPF?


Есть ли способ эффективно "псевдонимировать" команды в WPF ? Моя ситуация такова: я создал приложение, которое использует ApplicationCommands.Удалить в контексте графического редактора, который имеет несколько настроенных холстов. Некоторые элементы управления, которые находятся на этих холстах, используют текстовые поля, но вот проблема : TextBox не отвечает на команды ApplicationCommands.Удалить, он отвечает на команды редактора.Удалить. Есть ли способ аккуратно сделать текстовое поле, чтобы ответить на ApplicationCommands.Удалить без подклассов или вручную устанавливая привязки на каждом экземпляре текстового поля ?

1 3

1 ответ:

Чтобы ответить на ваш конкретный вопрос, я не знаю способа заставить две отдельные маршрутизируемые команды рассматриваться как одна и та же команда. Но поскольку ApplicationCommands.Delete является маршрутизируемой командой, после того, как она доставлена к своей цели, TextBox и нет привязки команды, она начнет пузыриться. Поэтому самое простое решение, которое удовлетворяет вашим требованиям, - это установить привязку команды для ApplicationCommands.Delete где-то между TextBox вплоть до Window, которая реализует поведение, которое вы жаждать.

Вот пример, который устанавливает обработчик на родительский Grid, который посылает" правильную " команду сфокусированному элементу, который в этом случае будет TextBox:

<Grid>
    <Grid.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Delete" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/>
    </Grid.CommandBindings>
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_Edit">
                <MenuItem Header="_Delete" Command="ApplicationCommands.Delete"/>
            </MenuItem>
        </Menu>
        <StackPanel>
            <TextBox Text="Some text"/>
        </StackPanel>
    </DockPanel>
</Grid>

И вот код-за:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    EditingCommands.Delete.Execute(null, Keyboard.FocusedElement);
}