首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RelayCommand和WeakReference

RelayCommand和WeakReference
EN

Stack Overflow用户
提问于 2012-11-08 09:35:42
回答 2查看 807关注 0票数 3

我有以下几点:

代码语言:javascript
复制
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,它将会工作。

EN

回答 2

Stack Overflow用户

发布于 2012-11-14 17:39:46

在您的lambda表达式中,dataService.GetData指令将不起作用,因为变量dataService的作用域仅限于构造函数。

相反,您应该将此引用复制到支持字段并调用此实例。当你说使用_dataService.GetData解决问题时,如果你认为你已经接近解决方案了。

代码语言:javascript
复制
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的作用域中),但它不能在运行时被调用,因为它不能被正确地计算。

票数 2
EN

Stack Overflow用户

发布于 2018-04-08 15:24:27

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13281181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档