C# 当列表框中的项目被选中时,CanExecute true

C# 当列表框中的项目被选中时,CanExecute true,c#,wpf,listbox,icommand,C#,Wpf,Listbox,Icommand,我对WPF比较陌生,所以这可能很琐碎,但我无法理解。 假设我有一个列表框和一个按钮。该按钮绑定到一个命令,该命令对列表中的选定项执行某些操作 例如: <ListBox Name="List" ItemsSource="{Binding Items}" /> <Button Content="Show!" Command="{Binding ShowCommand}" CommandParameter="{Binding ElementName=List, Path=Select

我对WPF比较陌生,所以这可能很琐碎,但我无法理解。 假设我有一个
列表框
和一个
按钮
。该按钮绑定到一个命令,该命令对列表中的选定项执行某些操作

例如:

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

当且仅当未选择任何项目时,我希望禁用按钮,理想情况下,我希望通过
ShowCommand.CanExecute
功能执行此操作。 我试着检查null参数,但如果一开始只检查一次,它就起作用了。如果我选择了一个项目,按钮仍处于禁用状态

我在这里尝试了这个建议: 但它根本不起作用。。。(同样的问题)我做错什么了吗


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

使用
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>
在VM中定义的命令应如下所示:

 private ICommand _showCommand;
    public ICommand ShowCommand => _showCommand ?? (_showCommand = new Command(ButtonClickAction));

    public void ButtonClickAction(object parameter)
    {
       //Your action
    }

您可能还想看看,以避免自己引发CanExecuteChanged事件。

您可以通过以下几种解决方案实现: 1) 将列表框的SelecteItem绑定到视图模型中的某个属性,并在属性设置器上调用ShowCommand.raiseCanceTechChanged()。
2) 使用将null转换为布尔值的转换器将按钮的IsEnabled绑定到列表框的SelecteItem。

可能与您使用的ICommand实现重复?这确实是一个简单的解决方案,但如果多个按钮绑定到同一命令,则需要我在多个按钮上重复此操作。另外,假设命令将绑定到菜单中的某个项目,我希望此功能也能正常工作。不,只需定义一个全局样式并将其应用于这些按钮!我已经有了按钮的样式。用同一个命令对每个按钮应用不同的样式将是一件痛苦的事情。我更喜欢带有“CanExecute”功能的解决方案。它干净舒适。只是因为某些原因,我在这里不工作……新的答案听起来不错!但是假设我想在execute函数中使用参数。我能做到吗?默认情况下,参数作为对象传递给Execute和CanExecute方法!
 private ICommand _showCommand;
    public ICommand ShowCommand => _showCommand ?? (_showCommand = new Command(ButtonClickAction));

    public void ButtonClickAction(object parameter)
    {
       //Your action
    }