【问题标题】:Odd behaviour onCanExecute RelayCommand MVVMLight 5+奇怪的行为 onCe Execute RelayCommand MVVM Light 5+
【发布时间】:2018-07-02 09:14:05
【问题描述】:

我正在将一个工具从 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 依赖于变量 IsActive,它决定了它是否被启用。有没有人我应该在 V5 中进行更改以使其正常工作?感谢您的建议。

【问题讨论】:

  • RelayCommand 使用什么命名空间?
  • 嗨@TheGeneral GalaSoft.MvvmLight.Command

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


【解决方案1】:

如果我理解正确的话。

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

在发行说明中:

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

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

【讨论】:

  • 谢谢!你摇滚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多