wpf CanExecute RelayCommand MVVMLight 5+上的异常行为

5ssjco0h  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(180)

我正在将一个工具从MVVM Light 4.0.3迁移到5.4.1,我发现最新的RelayCommand实现存在一个非常奇怪的问题。
这是V4.0.3中的旧实现:

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

在我能够使用变量定义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;
}

之前的代码能够在MVVM Light 4.0.3中启用按钮,而不会出现任何问题;但是,在最新的实现中始终禁用,我添加了一点更改,因为有了keepTargetAlive的新定义:

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

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

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => true, true);

这个实现在我的例子中将是无用的,因为RelayCommand(在名称空间GalaSoft.MvvmLight.Command中)依赖于变量IsActive,它决定了它是否被启用。有人知道我应该在V5中做什么修改才能使它工作吗?谢谢你的建议。

sdnqo3pr

sdnqo3pr1#

如果我没理解错的话。
如果在WPF4.5或更高版本中使用此类,则需要使用GalaSoft.MvvmLight.CommandWpf命名空间(而不是GalaSoft.MvvmLight.Command)。这将启用(或还原)CommandManager类,该类基于CanExecute委托处理控件的自动启用/禁用。
在发行说明中:

关于问题7659的重要说明:若要修复控件不再根据RelayCommand.CanExecute委托的状态而禁用的问题,您需要对代码做一个小更改。若要选择加入修复的行为,请将您正在使用的命名空间从GalaSoft.MvvmLight.Command更改为GalaSoft.MvvmLight.CommandWpf

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

相关问题