我将控件绑定到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; }
Run Code Online (Sandbox Code Playgroud)
SelectedPlayer定义:
public Player SelectedPlayer
{
get { return _selectedPlayer; }
set
{
SetProperty(ref this._selectedPlayer, value);
this.OnPropertyChanged(() => this.FormattedPlayerStatus);
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果你看一下DeletePlayerCommand实例化之上的那一行,那条线就可以了.我没有得到任何CanExecute行为,但至少它是有效的.原样,则DeletePlayerCommand命令永远不会触发关断,即使有断点,除非删除了构造的CanExecute部分完全.
任何人都可以向我解释为什么这是或我做错了什么?
如果是的CanExecute函数DeletePlayerCommand是() => SelectedPlayer != null,则在更改值时必须有一个DelegateCommandBase.RaiseCanExecuteChanged方法调用SelectedProperty:
在UI线程上引发CanExecuteChanged,以便每个命令调用者可以重新查询以检查命令是否可以执行.
适当的UI元素(带有数据绑定命令)是命令调用程序.
总而言之,该SelectedPlayer属性的实现应更新如下:
class PlayerManagementViewModel : BindableBase
{
private Player _selectedPlayer;
private readonly DelegateCommand _deletePlayerCommand;
public PlayerManagementViewModel(...)
{
_deletePlayerCommand = new DelegateCommand(() => DeleteSelectedPlayer(), () => SelectedPlayer != null);
}
public ICommand DeletePlayerCommand
{
get { return _deletePlayerCommand; }
}
public Player SelectedPlayer
{
get { return _selectedPlayer; }
set
{
SetProperty(ref _selectedPlayer, value);
OnPropertyChanged(() => FormattedPlayerStatus);
_deletePlayerCommand.RaiseCanExecuteChanged();
}
}
}
Run Code Online (Sandbox Code Playgroud)