使用 MVVM Light 的消息传递 ObservableCollection 时,传递的是副本还是引用?
When passing an ObservableCollection using MVVM Light's messaging, is a copy passed or is a reference passed?
我们正在使用 MVVM Light 开发一个新的 WPF 应用程序。我们有一个自定义的 ObservableCollection,它开始时绑定到数据网格。根据项目的规范,我们必须从显示数据网格的表单开始,然后当用户选择一行时,我们会以另一种形式向用户显示详细信息视图。此时我们正在获取选定的行并将其分配给我们分配给 MVVM Light 消息的对象,以便详细信息视图能够显示记录的详细信息。
既然我们开始讨论这个问题,我们就遇到了麻烦。规范要求详细视图能够在集合中导航,即使此时它没有集合。我们已经通过我们可以通过我们定义的我们称为 IRecordService 的接口来实现这一点,为我们使用的每种类型的记录实现它。然而,问题是记录不知道它是集合中的第一条记录、最后一条记录等等。这是必要的,因为详细信息表单上的按钮可以让人们在集合中导航。我们一直在尝试使用 CustomerRecordService 来做到这一点,但到目前为止还没有成功。如果我们坚持下去,也许会的。
但我一直在想,如果我们不是创建一个包含所选记录的对象并将其传递到消息中,而是将整个集合和所选记录的键传递到消息中,那会怎样呢?然后被细节视图模型捕获?我的同事主要关心的是在这种情况下 ObservableCollection 是如何传递的?是否传递了 ObservableCollection 的副本或对列表视图模型中的 ObservableCollection 的引用?我会认为它是一个参考,但想问问我是否正确。
它必须只是一个参考。否则信使必须知道如何克隆每个对象。但是你可以很容易地检查它。在您的详细信息视图模型中获得对象后,更改它。添加一些东西,删除一些东西并更改集合中某些对象的某些参数。然后检查它是否已经在主窗体中用网格进行了更改。
我们正在使用 MVVM Light 开发一个新的 WPF 应用程序。我们有一个自定义的 ObservableCollection,它开始时绑定到数据网格。根据项目的规范,我们必须从显示数据网格的表单开始,然后当用户选择一行时,我们会以另一种形式向用户显示详细信息视图。此时我们正在获取选定的行并将其分配给我们分配给 MVVM Light 消息的对象,以便详细信息视图能够显示记录的详细信息。
既然我们开始讨论这个问题,我们就遇到了麻烦。规范要求详细视图能够在集合中导航,即使此时它没有集合。我们已经通过我们可以通过我们定义的我们称为 IRecordService 的接口来实现这一点,为我们使用的每种类型的记录实现它。然而,问题是记录不知道它是集合中的第一条记录、最后一条记录等等。这是必要的,因为详细信息表单上的按钮可以让人们在集合中导航。我们一直在尝试使用 CustomerRecordService 来做到这一点,但到目前为止还没有成功。如果我们坚持下去,也许会的。
但我一直在想,如果我们不是创建一个包含所选记录的对象并将其传递到消息中,而是将整个集合和所选记录的键传递到消息中,那会怎样呢?然后被细节视图模型捕获?我的同事主要关心的是在这种情况下 ObservableCollection 是如何传递的?是否传递了 ObservableCollection 的副本或对列表视图模型中的 ObservableCollection 的引用?我会认为它是一个参考,但想问问我是否正确。
它必须只是一个参考。否则信使必须知道如何克隆每个对象。但是你可以很容易地检查它。在您的详细信息视图模型中获得对象后,更改它。添加一些东西,删除一些东西并更改集合中某些对象的某些参数。然后检查它是否已经在主窗体中用网格进行了更改。