DelegateCommand.CanExecute方法行为不正常

Ari*_*oth 1 c# wpf prism mvvm

我将控件绑定到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部分完全.

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

Ser*_*nov 5

如果是的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)

  • 值得注意的是,`DeletePlayerCommand`需要是`DelegateCommand`类型而不是`ICommand`才能工作.要么是这样,要么使用`DelegateCommand`类型的支持字段,并公开`ICommand`返回这个支持字段. (3认同)