【问题标题】:ListView selection problem - Caching prevents selection of many itemsListView 选择问题 - 缓存阻止选择许多项目
【发布时间】:2010-10-01 12:44:47
【问题描述】:

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

我有一个 ListView 绑定到具有“已选择”属性的项目的 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 中选择/取消选择。

谢谢

【问题讨论】:

    标签: wpf listview


    【解决方案1】:

    我建议您为列表视图项使用数据模板,并且在该数据模板中您应该有一个复选按钮或复选框等(即保持状态的控件)。然后我会将其数据绑定到您的视图模型。然后我会这样做,以便您完全绕过您在列表视图控件上选择的机制。您可以根据可绑定到您的视图模型的按钮状态为它们制作您的列表视图项模板。

    与 IsSelected 的工作方式相比,我提出的这个解决方案并不好。如果您想要一个更整洁的版本,也许您可​​以将我建议的内容实现为一个新的封装控件,它使 IsSelected 可观察/可绑定,就像您期望的那样。可用的第三方控件可能支持此行为?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多