CommandManager.InvalidateRequerySuggested不会导致MVVM-Light中的CanExecute重新查询

And*_*rea 8 wpf mvvm-light

我正在使用MVVM-Light RelayCommand

private ICommand myRevertCmd;
public ICommand Revert
    {
        get
        {
            if (myRevertCmd == null)
            {
                myRevertCmd = new RelayCommand(RevertExecute, CanRevertExecute);
            }

            return myRevertCmd;
        }
    }

    private void RevertExecute()
    {
        searchType = SearchType.Revert;
        SearchStart();
    }

    private bool CanRevertExecute()
    {
        return isRevertEnabled;
    }
Run Code Online (Sandbox Code Playgroud)

我有一些代码可以更改isRevertEnabled的值,但链接按钮不会更改.经过一些搜索,我发现你可以用来强制重新评估按钮状态

// force the GUI to re-evaluate the state of the buttons
CommandManager.InvalidateRequerySuggested();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有人有什么建议?

Jen*_*ens 33

只是为了添加另一个可能的解决方案,在我的情况下,我需要调用CommandManager.InvalidateRequerySuggestedUI线程使用Application.Current.Dispatcher.Invoke.

  • 在UI线程上提示的+1.我在后台线程上调用它,没有任何反应 (4认同)
  • 我可以再次投票支持这一点。我想知道为什么 MVVMLight 中默认情况下不这样做 (2认同)

bli*_*eis 7

那里有很多建议(这里,这里,这里).

我使用一个简单但不那么漂亮的解决方法.我只是OnPropertyChanged("MyICommand")在我的BackgroundWorker完成事件中调用我的命令.

  • 它可能是一个"不那么漂亮的解决方法",但OnPropertyChanged(Command)对我来说只是一招.谢谢你的想法.我从来没有想过这一点. (2认同)

Min*_*yen 0

我会将 isRevertEnabled 标志转换为属性,并从那里调用 OnPropertyChanged 方法(您需要实现 INotifyPropertyChanged 接口)。在更改标志时,您需要使用该属性,例如 IsRevertEnabled = true。

private bool isRevertEnabled;

public bool IsRevertEnabled
{
    get
    {
        return isRevertEnabled;
    }
    set
    {
        if (isRevertEnabled != value)
        {
            isRevertEnabled = value;
            OnPropertyChanged("IsRevertEnabled");
        }
    }
}

private bool CanRevertExecute()     
{         
    return IsRevertEnabled;     
}
Run Code Online (Sandbox Code Playgroud)