onCanExecute RelayCommand MVVMLight 5+上的异常行为

时间:2018-07-02 09:14:06

标签: c# wpf .net-4.5 mvvm-light relaycommand

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

这是 V4.0.3 中的旧实现:

img1

img2

这是 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;
}

在MVVM Light 4.0.3中,先前的代码能够启用按钮,而没有任何问题。但是,在始终禁用最新的实现的情况下,由于添加了 keepTargetAlive 的新定义,我添加了一些更改:

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

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

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

在我的情况下,此实现将无用,因为RelayCommand依赖于变量 IsActive ,该变量确定是否启用了该变量。我应该在 V5 中进行哪些更改以使其正常工作吗?感谢您的建议。

1 个答案:

答案 0 :(得分:3)

如果我正确理解这一点。

  

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

在发行说明中:

  

关于问题7659的重要说明:为了解决该问题,   控件不再被禁用,具体取决于   RelayCommand.CanExecute委托,您需要对   您的代码。要选择加入固定行为,请更改   从GalaSoft.MvvmLight.Command到的命名空间   GalaSoft.MvvmLight.CommandWpf

我没记错,在古代历史中,我必须自己做一个项目。