C# 如果选择了列表项,则为要启用的按钮执行CanExecute

C# 如果选择了列表项,则为要启用的按钮执行CanExecute,c#,.net,wpf,data-binding,mvvm,C#,.net,Wpf,Data Binding,Mvvm,我是MVVM新手,我想创建一个简单的命令按钮,如果选中列表中的任何项目,该按钮将被启用,并将listitem selected添加到收藏夹列表中。 下面是我的AddCommand实现: class AddFavCommand : ICommand { private readonly Action _favAction; private readonly bool _canExecute; public AddFavCommand() { }

我是MVVM新手,我想创建一个简单的命令按钮,如果选中列表中的任何项目,该按钮将被启用,并将listitem selected添加到收藏夹列表中。 下面是我的AddCommand实现:

class AddFavCommand : ICommand
{
    private readonly Action _favAction;
    private readonly bool _canExecute;

    public AddFavCommand()
    {
    }

    public AddFavCommand(Action favAction, bool canExecute)
    {
        _favAction = favAction;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _favAction();
    }
}
在我的视图模型中,我使用公共属性AddFavCommand来绑定我的视图:

    private AddFavCommand _addFavCommand;
    private bool _canAddFavExecute;

    public ICommand AddFavCommand
    {
        get
        {
            if (_addFavCommand == null)
            {
                _addFavCommand = new AddFavCommand(AddFav, _canAddFavExecute);
            }
            return _addFavCommand;
        }
    }
现在,我有一个简单的函数来检查命令是否有效:

    private void AddFav()
    {
        MessageBox.Show("Add");
    }
因此,这一部分在不实现canExecute属性的情况下可以完美地工作。 但现在我想在列表中的列表项未被选中时禁用该按钮。我有一个财产:

CurrentItem
它绑定到列表项,若未选择该项,则为空。我的问题是如何在未选择项目时触发禁用按钮。我试图补充:

   private void AddFav()
    {
        MessageBox.Show("Add");
        _canAddFavExecute = CurrentItem != null; // to my function, but my button always stays disabled.  
    }

谢谢

如果您已经创建了自己的委托命令,那么您必须提供如下所示的
CanExecute
委托,您可以在命令中的
CanExecuteChanged
事件中注册该委托

_addFavCommand = new AddFavCommand(AddFav, CanExecuteCommand);

public bool CanExecuteCommand(object parameter)
{
    return CurrentCommand != null;
}

CurrentCommand
的setter,您必须为您的命令引发
canexecutechanged
事件。在您的情况下,您只向命令提供了一次bool,因此它总是被禁用。

但它不起作用。
-太模糊了。什么不起作用?与你期望的相比,它有什么行为。你有错误吗?请具体说明。而且,这应该是
CurrentItem!=空
,并放置在属性设置更新问题中。我的按钮总是处于禁用状态。