Есть ли способ для псевдонима команд в WPF? - PullRequest
3 голосов
/ 24 февраля 2011

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

1 Ответ

2 голосов
/ 24 февраля 2011

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

Вот пример, который устанавливает обработчик на родительский элемент 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);
}
...