ListView选择问题 - 缓存可防止选择多个项目

时间:2010-10-01 12:44:47

标签: wpf listview

我对ListView选择项目的方式有疑问。

我有一个ListView绑定到具有'Selected'属性的项的ObservableCollection。我已经选择了这样的选择状态:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=TwoWay}" />
    </Style>
</ListView.ItemContainerStyle>

但是在列表中大约有1000个项目,ListView仅在开始时保存可见对象的容器,或者在已经滚动的情况下保存大约500个容器。因此,即使我选择全部(Ctrl + A),也只为这500个选择设置。

我还尝试了很多其他的解决方案,但没有一个能够解决。

  • ListView.SelectedItems无法绑定。
  • 使用SelectionChanged事件设置'Selected'属性 - 在滚动到某个区域时触发了很多SelectionChanged事件,该区域在选择时未缓存,因此列表中的项目为“新选择”。
  • 使用ListView的SelectionChanged事件将更改的选择添加到额外的集合并将其删除 - 无法从ViewModel中选择,因为只能在一个方向上工作。

无论如何可能有一个ListView,我可以选择超过500个项目,并在ViewModel中的某处提供此信息。也可以从ViewModel中选择/取消选择。

由于

1 个答案:

答案 0 :(得分:0)

我建议您使用listviewitems的数据模板,在该数据模板中,您应该有一个复选按钮,或者复选框等(即维护状态的控件)。然后我会将其数据绑定到您的viewmodel。然后我会这样做,以便你完全在listview控件上绕过你选择的机制。您可以根据可绑定到viewmodel的按钮状态为listviewitems创建模板。

我提议的这个解决方案并不精彩,与IsSelected相比,正如您所期望的那样。如果你想要一个更整洁的版本,也许你可以实现我所建议的作为一个新的封装控件,它使IsSelected可观察/可绑定,就像你期望的那样。可能的第三方控件可能会支持这种行为吗?