如果选择了listBox中的项,则CanExecute为true

时间:2018-02-20 14:21:10

标签: c# wpf listbox icommand

我对WPF比较陌生,所以这可能是微不足道的,但我无法弄清楚这一点。 假设我有一个ListBox和一个Button。该按钮绑定到一个命令,该命令对列表中选定的项目执行某些操作。

示例:

<ListBox Name="List" ItemsSource="{Binding Items}" />
<Button Content="Show!" Command="{Binding ShowCommand}" CommandParameter="{Binding ElementName=List, Path=SelectedItem}"/>

我希望当且仅当没有选择任何项目时才禁用该按钮,理想情况下我希望通过ShowCommand.CanExecute功能执行此操作。 我尝试检查null参数,如果只在开头检查一次,它就可以。如果我选择一个项目,该按钮仍然是禁用的。

我在这里尝试了这个建议:WPF CommandParameter binding not updating 但它根本不起作用......(同样的问题)我做错了什么?

当我在列表中选择一个项目时,如何让他回忆起canExecute? 。

2 个答案:

答案 0 :(得分:1)

您可以使用DataTrigger

轻松实现这一目标
<ListBox Name="List" ItemsSource="{Binding Items}" />
<Button Content="Show!" Command="{Binding ShowCommand}" CommandParameter="{Binding ElementName=List, Path=SelectedItem}">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedItem,ElementName=List}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
</Button>

<强>更新

使用CanExecute无法实现此目的的原因很可能是因为CanExecuteChanged事件未被提升,以解决您可以利用{{1}通过将此事件与您的命令CommandManager.RequerySuggested事件[1]相关联。

这是您案例中CanExecuteChanged的基本实现和使用:

ICommand

VM中定义的命令应如下所示:

public class Command : ICommand
{
    private readonly Action<object> _action;
    public Command(Action<object> action)
    {
        _action = action;
    }
    public bool CanExecute(object parameter)
    {
        //the selected item of the ListBox is passed as parameter
        return parameter != null;
    }
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        //the selected item of the ListBox is passed as parameter
        _action(parameter);
    }
}

您可能还想查看Routed Commands以避免自己提升CanExecuteChanged事件。

答案 1 :(得分:0)

你可以用很少的解决方案来实现它: 1)将ListBox的SelecteItem绑定到视图模型中的某个属性,并在属性setter上调用ShowCommand.RaiseCanExecuteChanged()。 2)使用一些将null转换为布尔值的转换器将按钮的IsEnabled绑定到ListBox的SelecteItem。