奇怪的行为 onCanExecute RelayCommand MVVMLight 5+

Fed*_*ete 1 c# wpf relaycommand mvvm-light .net-4.5

我正在将一个工具从 MVVM Light 4.0.3 迁移到 5.4.1,我发现最新的RelayCommand实现有一个非常奇怪的问题。

这是V4.0.3 中的旧实现:

图像1

图像2

这是V5.4.1 中的最新实现:

img4

img3

在我能够使用变量通过以下代码定义canExecute行为(启用按钮)之前:

public ICommand GetNewItemsFromDB { get; private set; }

private bool _IsActive;
public bool IsActive
{
    get
    {
        return _IsActive;
    }
    set
    {
        if (_IsActive != value)
        {
            _IsActive = value;
            this.RaisePropertyChanged(() => IsActive);
        }
    }
}

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => { return IsActive == false; });

private void GetDataFromDB()
{
    IsActive = true;
}
Run Code Online (Sandbox Code Playgroud)

之前的代码能够在 MVVM Light 4.0.3 中启用按钮而没有任何问题;然而,在最新的实现中总是被禁用,我添加了一些更改,因为有一个新的keepTargetAlive定义:

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => { return IsActive == false; }, true);
Run Code Online (Sandbox Code Playgroud)

另外,我尝试了false选项,但没有任何改变。我发现重新启用它的唯一方法是设置一个像这样的预定义值:

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => true, true);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,此实现将毫无用处,因为 RelayCommand 取决于变量IsActive,该变量确定它是否已启用。有没有人我应该在V5 中更改以使其工作?感谢您的建议。

AAA*_*ddd 6

如果我正确理解这一点。

如果您在 WPF4.5 或更高版本中使用此类,则需要使用 GalaSoft.MvvmLight.CommandWpf命名空间(而不是 GalaSoft.MvvmLight.Command)。这将启用(或恢复)基于 CanExecute 委托处理自动启用/禁用控件的 CommandManager 类。

在发行说明中:

关于问题 7659 的重要说明:为了解决根据 RelayCommand.CanExecute 委托的状态不再禁用控件的问题,您需要对代码进行一些小的更改。要选择加入固定行为,请将您使用的命名空间从 更改GalaSoft.MvvmLight.CommandGalaSoft.MvvmLight.CommandWpf

我没记错,在古代历史的某个地方,我不得不为一个项目自己做这件事。