【发布时间】:2011-12-26 16:17:22
【问题描述】:
我有一些数据的两种视图:一个列表视图(现在是ListBox,但我一直想切换到ListView)和地图上的精美图形表示。在任一视图中,用户都可以单击一个对象,它将在两个视图中被选中。多选也是可能的,因此每个ViewModel 实例都有自己的IsSelected 属性。
目前我将ListBoxItem.IsSelected 绑定到ViewModel.IsSelected,但这只有在ListBox 没有虚拟化(see here)时才能正常工作。不幸的是,禁用虚拟化会影响性能,而且我的应用变得太慢了。
所以我必须再次启用虚拟化。为了维护屏幕外项目的ViewModel.IsSelected 属性,我注意到ListBox 和ListView 有一个SelectionChanged 事件,我可以(大概)使用它来将选择状态从ListBox/ListView 传播到ViewModel.
我的问题是,如何反向传播选择状态? ListBox/ListView 的 SelectedItems 属性是只读的!假设用户单击图形表示中的一个项目,但它在屏幕外 w.r.t.名单。如果我只是设置ViewModel.IsSelected,那么ListBox/ListView 将不知道新的选择,因此如果用户单击列表中的其他项目,它将无法取消选择该项目。我可以从ViewModel 拨打ListBox.ScrollIntoView,但有几个问题:
- 在我的 UI 中,如果它们以图形方式位于同一位置,实际上可以一键选择两个项目,尽管它们可能位于
ListBox/ListView中完全不同的位置。 - 它破坏了 ViewModel 的隔离(我的 ViewModel 完全不知道 WPF,我想保持这种状态。)
那么,亲爱的 WPF 专家,有什么想法吗?
编辑:我最终切换到 Infragistics 控件并使用了一个丑陋且相当缓慢的解决方案。重点是,我不再需要答案了。
【问题讨论】:
标签: .net wpf mvvm multi-select virtualizingstackpanel