1

我是 MVVM 的新手,我想创建一个简单的命令按钮,如果选择了列表中的任何项目,该按钮将被启用,并将列表项添加到收藏夹列表中。这是我的 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.  
    }

谢谢

4

1 回答 1

3

如果您创建了自己的委托命令,那么您将必须提供CanExecute如下所示的委托,并且您可以在命令中将其注册到您的CanExecuteChanged事件中。

_addFavCommand = new AddFavCommand(AddFav, CanExecuteCommand);

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

并且从你的设置者那里CurrentCommand你将不得不canexecutechanged为你的命令引发事件。在您的情况下,您已经向命令提供了一次 bool,因此它始终被禁用。

于 2013-09-17T17:25:04.300 回答