C# RelayCommand构造函数参数vs字段

C# RelayCommand构造函数参数vs字段,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,我偶然发现RelayCommand有一个非常奇怪的问题。比较这两个代码段: 片段1: public RimfirePistolResultsViewModel(Database db, IApplicationSettingsService applicationSettingsService, Router router) : base(db, db.RimfirePistolResults, applicationSettingsService) { _router = ro

我偶然发现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 });
        });              
}
public-rimfielistolresultsviewmodel(数据库数据库数据库、IAApplicationSettingsService应用程序设置服务、路由器)
:base(db,db.rimFireistolResults,applicationSettingsService)
{
_路由器=路由器;
ClarifyResultCommand=新的RelayCommand(id=>
{
MessageBox.Show(“Id:+Id”);
Go(新的{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 });
        });              
}
public-rimfielistolresultsviewmodel(数据库数据库数据库、IAApplicationSettingsService应用程序设置服务、路由器)
:base(db,db.rimFireistolResults,applicationSettingsService)
{
_路由器=路由器;
ClarifyResultCommand=新的RelayCommand(id=>
{
MessageBox.Show(“Id:+Id”);
_Go(新的{Id=Id});
});              
}

代码段1和代码段2之间的唯一区别在于,在第一个代码段中,我调用作为构造函数参数传递的路由器实例,在第二个代码段中,我调用分配给字段的路由器实例。当我将命令绑定到DataGrid中的按钮时,第一个解决方案不起作用,而第二个解决方案没有问题。我认为既然C#有闭包,这两种方法应该都能很好地工作。有人能解释一下为什么会发生这种情况吗?

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