我有以下几点:
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
NotWorkingCommand = new RelayCommand(() =>
dataService.GetData((item, error) =>
{
if (error != null)
{
// Report error here
return;
}
WelcomeTitle = item.Title;
}));
}有人能解释一下为什么我的RelayCommand会在一段时间后停止工作吗?我怀疑这与RelayCommand中使用的WeakReference有关,但我没有使用WeakReference的经验。如果我使用_dataService.GetData,它将会工作。
发布于 2012-11-14 17:39:46
在您的lambda表达式中,dataService.GetData指令将不起作用,因为变量dataService的作用域仅限于构造函数。
相反,您应该将此引用复制到支持字段并调用此实例。当你说使用_dataService.GetData解决问题时,如果你认为你已经接近解决方案了。
private readonly IDataService _dataService;
public RelayCommand NotWorkingCommand { get; private set; }
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
NotWorkingCommand = new RelayCommand(() =>
_dataService.GetData((item, error) =>
{
if (error != null)
{
// Report error here
return;
}
WelcomeTitle = item.Title;
}));
}看起来委托是正确创建的,因为在创建relay命令时引用已经存在(在ctor的作用域中),但它不能在运行时被调用,因为它不能被正确地计算。
发布于 2018-04-08 15:24:27
marckm在这里没有错,建议使用类级变量将会起作用。但我只想澄清一下,这个问题的完整答案应该包括一些关于lambdas中的“变量捕获”的信息。
在MVVMLight开始使用弱引用之前,方法级变量dataService会被捕获到lambda表达式中。通常,一旦方法完成,这个变量就会超出作用域。由于lambda中的变量捕获,这在这里不会发生,这就是为什么lambda的主体将(总是)在以后工作。
在MVVMLight移动到弱引用后,代码最初将正常工作,但如果没有类级变量(和赋值),方法级变量最终将被垃圾回收,然后RelayCommand将停止工作。这正是你在这里看到的(六年前-我知道-但这个问题今天仍然有效)。
https://stackoverflow.com/questions/13281181
复制相似问题