绑定到包含集合/列表的模型

绑定到包含集合/列表的模型

问题描述:

我正在构建一个简单的财务记录应用程序。主窗口视图模型包含帐户列表。该视图显示此列表(在ListView中)以及显示当前所选帐户详细信息的面板。绑定到包含集合/列表的模型

首先,我将详细信息面板和ListView的SelectedItem绑定到视图模型上的相同属性(类型为Account)。但是,我很快意识到,详细信息面板需要绑定到AccountViewModel,而不是直接绑定到Account的实例。

有几种方法来提供这种AccountViewModel:

  • 绑定的详细信息面板上的视图模型一个单独的属性。当ListView的SelectedItem发生更改时,视图模型应创建此新属性并将其设置为与所选帐户关联的AccountViewModel实例。
  • 给主视图模型一个AccountViewModels而不是一个帐户列表的列表。列出所有帐户和详细信息面板的ListView都可以绑定到主视图模型上的同一个属性。
  • 有一个AccountViewModel,更改该帐户引用 ListView的SelectedItem属性的每个更改。

还有其他的选择吗?你推荐哪个选择?

谢谢 本

+0

对我而言,第三个选项似乎最适合M-V-VM模式,但我真的很想知道您的想法。 – 2009-11-20 17:54:10

+0

Account和AccountViewModel之间的关系是什么? '帐户'是Web服务/数据库创建的类吗? – 2009-11-20 19:07:35

+0

帐户将直接来自服务/ db层。如有必要,可以改变。 – 2009-11-20 20:13:17

到目前为止,我最喜欢的想法是#3从原来的职位,为期reaons:

  • 它有一个1以1视图模型对应,我认为最适合的MV-VM模式。
  • 由于帐户视图模型被告知何时更改以显示其他帐户的详细信息,它可以询问用户是否希望在更改显示新帐户(等)之前保存未保存的编辑。

我喜欢这个选项

  • 绑定的详细信息面板上的视图模型单独 属性。当 ListView的SelectedItem更改时, 视图模型应创建此 新属性并将其设置为 与选定帐户相关联的 的AccountViewModel实例。

然后您可以将所选项目绑定到视图模型和详细信息窗格。这可以独立于视图进行测试。当你创建你的账户列表时,你也可以创建一个账户查看模型列表,所以当你改变选择时,你不需要创建任何东西。这种方式你的viewmodel是全面的,代表整个屏幕不仅仅是viewModel的浮动位。

这是我做的:

给主视图模型 AccountViewModels,而不是一个 帐户列表列表。

这将在很多方面为您服务。我总是发现,最终,出于某种原因,我需要以某种方式增强我的模型以支持视图,所以现在我刚开始创建ViewModels。

方式可以告诉这将是一个更好的选择是它涉及更少的代码。在我看来,更少的代码总是等于更少的错误。

+0

正如我想到这种方法,我想知道:视图模型不应该与视图相对应吗?也就是说,如果只有一个帐户视图,应该只有一个帐户vm还是可以有几个?如果我们有一个视图有多个视图模型,我们是否正在实施M-V-VM以外的其他视图模型? – 2009-11-23 17:37:06

+0

我认为ViewModel有*其他ViewModel作为属性是可以的,如果这就是你的意思。我不认为一个观点=一个观点模型。如果您的意思是您可能需要多个ViewModel来表示相同的模型,以便允许不同的视图以不同的方式和不同的行为显示相同的数据位,那么您是正确的。有时候我有多个版本的“AccountViewModel”,因为不同的视图需要不同的行为。 – 2009-11-23 21:00:03

+1

Josh Smith在其规范的MVVM示例应用程序中将ViewModel的集合用作ViewModel中的一个属性。 (MainWindowViewModel的命令)。 – Guge 2009-11-24 06:57:28