3

我有以下内容:

public MainViewModel(IDataService dataService)
{
    _dataService = dataService;

    NotWorkingCommand = new RelayCommand(() => 
    dataService.GetData((item, error) =>
    {
        if (error != null)
        {
            // Report error here
            return;
        }
        WelcomeTitle = item.Title;
    }));
}

有人可以解释一下为什么我RelayCommand会在一段时间后停止射击吗?我怀疑它与WeakReferenceused in the有关,RelayCommand但我没有使用WeakReference. 如果我_dataService.GetData改用它,它将起作用。

4

2 回答 2

2

在您的 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;
        }));
    }

似乎正确创建了委托,因为在创建中继命令时(在ctor的范围内)存在引用,但由于无法正确评估它,因此无法在运行时调用它。

于 2012-11-14T09:39:46.350 回答
0

marckm 在这里没有错,使用类级变量的建议将起作用。但我想澄清一下,这个问题的完整答案应该包括一些关于 lambdas 中“变量捕获”的信息。

MVVMLight 开始使用弱引用之前,方法级变量 dataService 将被 lambda 表达式捕获。通常,一旦方法完成,此变量将超出范围。由于 lambda 中的变量捕获,这不会在这里发生,这就是为什么 lambda 的主体将(总是)稍后工作的原因。

MVVMLight 移至弱引用后,代码最初可以工作,但没有类级变量(和赋值),方法级变量最终将被垃圾收集,然后 RelayCommand 将停止工作。这正是您在这里看到的(六年前 - 我知道 - 但这个问题今天仍然有效)。

于 2018-04-08T07:24:26.563 回答