我将控件绑定到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部分。
任何人都可以向我解释为什么会这样或者我做错了什么?
答案 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;
}
}
}