【问题标题】:Implement CanExecute for button to be enabled if list item is selected如果选择列表项,则实现 CanExecute 以启用按钮
【发布时间】:2013-09-17 17:17:20
【问题描述】:

我是 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.  
    }

谢谢

【问题讨论】:

  • but it doesn't work. - 太模糊了。什么不起作用?它有什么行为与您的期望。你有任何错误吗?请具体。此外,这应该是 CurrentItem != null 并放置在属性设置器中
  • 更新问题。我的按钮始终处于禁用状态。

标签: c# .net wpf data-binding mvvm


【解决方案1】:

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

_addFavCommand = new AddFavCommand(AddFav, CanExecuteCommand);

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

CurrentCommand 的设置器中,您必须为您的命令引发canexecutechanged 事件。在您的情况下,您已经向命令提供了一次 bool,因此它始终被禁用。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多