WPF:ApplicationCommands似乎忽略了CommandTarget

时间:2011-07-20 15:11:05

标签: wpf xaml routed-commands

我的窗口中有TextBoxListView,我想在ListView有焦点的同时上下移动TextBox的选择:

enter image description here

但是,我似乎没有得到我的CommandTarget声明,他们被忽略了。 MSDN says这是非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 个答案:

答案 0 :(得分:1)

实际上,由于RoutedUICommand派生自RoutedCommand,它们都支持命令目标(MSDN实际上说命令目标仅适用于RoutedCommands,但它意味着它不适用于其他ICommand派生对象)。

您是否实际将提到的ComponentCommands(MoveDown和MoveUp)绑定到代码后面的ListView中? ListView在首次创建时没有命令绑定,因此您需要执行以下操作:

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

然后你必须编写你的ExecuteMoveDown函数来进行移动。