如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择

Posted

技术标签:

【中文标题】如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择【英文标题】:How to have different selections of two listviews bound to the same instances in WPF / MVVM 【发布时间】:2012-03-13 09:45:07 【问题描述】:

我正在使用 WPF 和 MVVM。 在我的应用程序中,最好从主屏幕中选择一个项目,然后按一个按钮查看详细信息。应该打开一个新窗口,并且可以在列表视图中进行(多个)选择,其中 IsSelected 绑定到 ObservebleCollection 中的项目。

当用户再次按下该按钮(主屏幕上的相同选择)时,会打开另一个具有相同详细信息的窗口。但是,我假设如果做出不同的选择,第一个窗口会同步并显示相同的选择。

我希望这两个窗口可以有不同的选择。这可能吗?应该怎么做才能让它发挥作用?

更新: 示例:假设我有一辆有 4 个***的汽车(收藏)。两个窗口中的列表视图都显示了 4 个***(一项是一个***)。当我在列表视图中选择轮 1 和 2 时,我认为在另一个窗口中也会选择轮 1 和 2。但我想在窗口 2 中选择 3 和 4,在窗口 1 中选择轮 1 和 2)。而且我不想添加另一个 4 个***的集合,否则我会有一辆有 8 个***的汽车……或者 2 辆有 4 个***的汽车,但如果我更换*** 3 和 4,它只会改变第二辆车。

更新 2: 顺便说一句,在我的应用程序中:

我有 0 到 n 个带有列表视图的窗口。 我创建了一个包含视图模型的窗口。 每个视图模型都引用“真实”模型。

所选项目的绑定变量在真实模型中,我想我需要将它移动到视图模型,但我不知道如何。因为(示例中的***的)属性位于“真实”模型中,并且这些属性也绑定在同一个列表视图(项目)中。 我c

【问题讨论】:

【参考方案1】:

如果只有两个列表,您可以将 IsSelected 绑定到两个单独的属性(即 IsSelectedInList1、IsSelectedInList2)。

但实际上,视图模型应该是 UI 的代码内无视图表示。因此,如果您的 UI 中有两个(或 N 个)列表副本,它们应该具有不同的状态,那么在内存中创建该视图模型的两个(或 N 个)副本来表示它是有意义的。

而且我不想添加另一个 4 个***的集合,否则我会有一辆有 8 个***的汽车……或者 2 辆有 4 个***的汽车,但如果我更换*** 3 和 4,它只会改变第二辆车.

我认为在考虑您的模型时更是如此。在您的模型中,您需要特定汽车的一个实例,并且该汽车应该有一个包含四个***的集合。但是,如果您想要两个不同的视图(具有不同的状态),则可以从该模型创建两个视图模型。

【讨论】:

两个列表只是一个例子,实际上我可以有 0、1 个或更多的带有列表视图的窗口,它们都使用相同的底层模型(在我的例子中是汽车)。我知道我需要两个视图模型,但这些视图模型应该引用同一个模型(汽车)......或者我应该在发生变化时同步所有模型,除了所选项目,在我的示例中是车轮)? 所以你希望列表中的***保持同步,除了选择状态?您可以制作一个具有 IsSelected 属性的包装视图模型,以及对***本身的引用。每次显示新列表时,您都可以构建这些包装器的新集合。在您的绑定中,您可以说 Wrapper.IsSelected 和 Wrapper.Wheel.SomeProperty。 听起来应该是可能的,但它会使我的模型(视图)更加复杂。 (如果你不介意,我会等待接受答案,直到我检查它是否有效)。 我暂时不打算实现它,因为它的工作量太大,但是,知道解决方案是件好事......现在我要阻止打开两个显示模型的同一部分。【参考方案2】:

只有当两个列表都绑定到同一个集合(即同一个引用)或绑定到包含相同对象实例的集合时,这两个窗口才会同步。因此,每个视图模型都需要自己独立的集合。

【讨论】:

是的,但事实就是如此。我在我的问题中举了一个例子,以使其更清楚。 意思是我有相同的收藏,但通过上面的汽车示例,我希望清楚地说明拥有相同的收藏是直观的。 我赞成它,因为它证实了我的猜测,列表视图选择将被同步,但是......如何不同步它而是使用相同的模型/对象实例?

以上是关于如何在 WPF / MVVM 中对绑定到相同实例的两个列表视图进行不同选择的主要内容,如果未能解决你的问题,请参考以下文章

wpf中mvvm的Command绑定后,如何在点击按钮的时候在viewmodel里面异步执行方法。

WPF:如何使用 MVVM 将命令绑定到 ListBoxItem?

WPF 在 MVVM 模式下实现窗口后台代码与ViewModel交互

WPF MVVM:组合框 SelectedValue 绑定

wpf mvvm下viewmodel中对view进行操作

WPF MVVM:如何将 GridViewColumn 绑定到 ViewModel-Collection?