DelegateCommand.CanExecute方法行为不正常

时间:2015-01-29 22:46:44

标签: c# wpf mvvm prism

我将控件绑定到DelegateCommand,并且它的CanExecute部分无法正常工作。我正在使用Prism库。谁能告诉我为什么?

命令声明和实例化:

public PlayerManagementViewModel(DatabaseManager dbManager)
{
    _dbManager = dbManager;
    this.ResetUpToDateStatusCommand = new DelegateCommand(() => this.ResetXpUpToDateStatus());
    this.DeletePlayerCommand = new DelegateCommand(() => this.DeleteSelectedPlayer(), () => SelectedPlayer != null);
    this.RefreshPlayers();
}

public ICommand DeletePlayerCommand { get; private set; }

SelectedPlayer定义:

public Player SelectedPlayer
{
    get { return _selectedPlayer; }
    set
    {
        SetProperty(ref this._selectedPlayer, value);
        this.OnPropertyChanged(() => this.FormattedPlayerStatus);
    }
}

奇怪的是,如果你看一下DeletePlayerCommand实例化之上的那一行,该行就可以了。我没有得到任何CanExecute行为,但至少它有效。即使使用断点,DeletePlayerCommand命令也永远不会触发,除非我完全删除构造函数的CanExecute部分。

任何人都可以向我解释为什么会这样或者我做错了什么?

2 个答案:

答案 0 :(得分:5)

如果CanExecute的{​​{1}}功能为DeletePlayerCommand,则() => SelectedPlayer != null值更改后必须有DelegateCommandBase.RaiseCanExecuteChanged Method次呼叫:

  

在UI线程上引发CanExecuteChanged,这样每个命令调用者都可以重新查询命令是否可以执行。

适当的UI元素(带数据绑定命令)是命令调用者。

总而言之,SelectedProperty属性的实现应更新如下:

SelectedPlayer

答案 1 :(得分:0)

这是PRISM DelegateCommnd的设计方式。参考CanExecuteChanged event of ICommand

或者,您可以派生DelegateCommand来克服限制。请参考以下代码。

 class DelegateCmdEx : DelegateCommand
{       
    public DelegateCmdEx(Action executeMethod):base(executeMethod)
    {

    }

    public DelegateCmdEx(Action executeMethod, Func<bool> canExecuteMethod)
        : base(executeMethod, canExecuteMethod)
    {

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