如何使用命令来响应ListBox

时间:2017-11-28 14:25:10

标签: wpf listbox routed-commands

我正在尝试学习命令,并设置了一个简单的wpf项目来使用自定义命令。我在窗口上有一个ListBox和一个Button。当ListBox具有焦点并且选择了Item时,我希望启用Button,否则应该禁用它。

我在一个单独的CustomCommands类中定义了一个CustomCommand:

Public Shared ReceivedFocus As New RoutedCommand

在我的窗口中,我将其设置如下:

<CommandBinding
    Command="{x:Static local:CustomCommands.ReceivedFocus}"
    CanExecute="CanActivate"
    Executed="ChangeSelection">
</CommandBinding>

并使用ListBox的命令,如下所示:

<ListBox
    x:Name="lstInactive">
    <i:Interaction.Triggers>
        <i:EventTrigger
            EventName="GotFocus">
            <i:InvokeCommandAction
                Command="{x:Static local:CustomCommands.ReceivedFocus}"
            </i:InvokeCommandAction>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListBox>

最后,CanActivate例程是:

Private Sub CanActivate(sender As Object, e As CanExecuteRoutedEventArgs)
        If lstInactive.SelectedIndex >= 0 Then
            e.CanExecute = True
        Else
            e.CanExecute = False
        End If
End Sub

这不起作用。主要问题是我不明白如何将CanExecute值与Button相关联。我应该忽略CanActivate例程中的CanExecute值,而只是设置Button的Enabled属性吗?如果是这样,CanExecuteRoutedEventArgs的CanExecute参数的值是多少?

第二个问题是,在我第二次选择ListBox中的项目之前,GotFocus事件才会触发。

或许我根本没有掌握指挥,这不是正确的方法。这个小项目本身并不重要,它旨在确保在我开始在“真实”项目中使用命令之前阅读了大量关于它的文章后理解命令。可悲的是,在这个阶段很明显我没有。

1 个答案:

答案 0 :(得分:0)

  

这不起作用。主要问题是我不明白如何将CanExecute值与Button相关联。

将其Command属性绑定到同一命令:

<Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" />

然后应根据您在Button事件处理程序中设置CanExecute属性的值启用或禁用CanActivate

您可能还想收听SelectionChanged事件。这按预期工作:

<StackPanel>
    <StackPanel.CommandBindings>
        <CommandBinding
                Command="{x:Static local:CustomCommands.ReceivedFocus}"
                CanExecute="CanActivate"
                Executed="ChangeSelection">
        </CommandBinding>
    </StackPanel.CommandBindings>

    <ListBox x:Name="lstInactive">
        <ListBoxItem>first</ListBoxItem>
        <ListBoxItem>second</ListBoxItem>
        <ListBoxItem>third</ListBoxItem>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{x:Static local:CustomCommands.ReceivedFocus}">
                </i:InvokeCommandAction>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListBox>

    <Button Content="Button" Command="{x:Static local:CustomCommands.ReceivedFocus}" />
</StackPanel>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void CanActivate(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = lstInactive.SelectedIndex >= 0;
    }

    private void ChangeSelection(object sender, ExecutedRoutedEventArgs e)
    {

    }
}