WPF: ApplicationCommands, кажется, игнорируют CommandTarget - PullRequest
2 голосов
/ 20 июля 2011

У меня есть TextBox и ListView в моем окне, и я хотел бы переместить выделение ListView вверх и вниз, в то время как у TextBox есть фокус:

enter image description here

Тем не менее, я, кажется, не понимаю мои объявления CommandTarget, они игнорируются. MSDN говорит, что это поведение по умолчанию для не-RoutedCommands, но команды перемещения, которые я пытаюсь использовать, RoutedUICommands, так что это, вероятно, не проблема здесь.

Я что-то упустил?

Мой XAML в настоящее время выглядит следующим образом (код позади пуст):

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Test Window">
    <StackPanel>
        <TextBox>
            <TextBox.InputBindings>
                <!-- for some reason, these two won't work -->
                <KeyBinding Key="Down" 
                            Command="ComponentCommands.MoveDown"
                            CommandTarget="{Binding ElementName=AllItemsList}"/>
                <KeyBinding Key="Up" 
                            Command="ComponentCommands.MoveUp"
                            CommandTarget="{Binding ElementName=AllItemsList}"/>
            </TextBox.InputBindings>
        </TextBox>
    <ListView x:Name="AllItemsList">
            <ListViewItem>Item 1</ListViewItem>
            <ListViewItem>Item 2</ListViewItem>
            <ListViewItem>Item 3</ListViewItem>
        </ListView>
    </StackPanel>
</Window>

1 Ответ

1 голос
/ 20 июля 2011

На самом деле, поскольку RoutedUICommand является производным от RoutedCommand, они оба поддерживают цель команды (MSDN фактически говорит, что цели команды работают ТОЛЬКО на RoutedCommands, но это означает, что она не работает на других производных объектах ICommand).

Вы действительно связали упомянутые ComponentCommands (MoveDown и MoveUp) в ListView в своем коде позади?При первом создании ListView не содержит привязок команд, поэтому вам нужно будет выполнить что-то вроде:

AllItemsList.CommandBindings.Add(new CommandBinding(ComponentCommands.MoveDown, ExecuteMoveDown));

Затем вам потребуется написать функцию ExecuteMoveDown, чтобы выполнить перемещение.

...