我偶然发现了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#有闭包,两者都应该可以正常工作。有人可以解释一下为什么会发生这种情况吗?
答案 0 :(得分:1)
它与变量范围有关。 代码段1:您正在使用通过构造函数传递的变量,但变量的范围在构造函数中。您正在匿名委托中使用该变量,该变量将在调用Command时执行。在匿名委托中,您的变量不在范围内。 代码段2:由于您将变量分配给类中的字段,因此它将在整个类中具有范围,因此在匿名委托中使用该变量将是很好的。 希望很清楚。