RelayCommand构造函数参数vs字段

时间:2015-02-22 15:03:21

标签: c# wpf mvvm-light

我偶然发现了RelayCommand非常奇怪的问题。比较这两个代码段:

摘录1:

public RimfirePistolResultsViewModel(Database db, IApplicationSettingsService applicationSettingsService, Router router)
    : base(db, db.RimfirePistolResults, applicationSettingsService)
{
    _router = router;

    ClarifyResultCommand = new RelayCommand<int>(id =>
        {
            MessageBox.Show("Id: " + id);
            router.Go<ClarifyRimfirePistolView>(new { Id = id });
        });              
}

摘录2:

public RimfirePistolResultsViewModel(Database db, IApplicationSettingsService applicationSettingsService, Router router)
    : base(db, db.RimfirePistolResults, applicationSettingsService)
{
    _router = router;

    ClarifyResultCommand = new RelayCommand<int>(id =>
        {
            MessageBox.Show("Id: " + id);
            _router.Go<ClarifyRimfirePistolView>(new { Id = id });
        });              
}

Snippet 1和2之间的唯一区别在于,在第一个中,我将Router实例作为构造函数参数传递,在第二个中将其分配给field。当我将命令绑定到DataGrid中的按钮时,第二个解决方案在第二个工作时没有问题就无法工作。我认为既然C#有闭包,两者都应该可以正常工作。有人可以解释一下为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:1)

它与变量范围有关。 代码段1:您正在使用通过构造函数传递的变量,但变量的范围在构造函数中。您正在匿名委托中使用该变量,该变量将在调用Command时执行。在匿名委托中,您的变量不在范围内。 代码段2:由于您将变量分配给类中的字段,因此它将在整个类中具有范围,因此在匿名委托中使用该变量将是很好的。 希望很清楚。