【发布时间】:2009-06-11 19:01:35
【问题描述】:
C#:如何在虚拟模式下有效过滤(隐藏)ListView 项?
我正在寻找一种在虚拟模式下过滤(隐藏/显示)ListView 中的项目的方法。我将我的项目缓存在列表视图项目数组中,我怎样才能有效地做到这一点,以便在按下过滤器按钮时只显示特定的列表视图项目,然后在按下非过滤器按钮时将它们全部返回?
【问题讨论】:
C#:如何在虚拟模式下有效过滤(隐藏)ListView 项?
我正在寻找一种在虚拟模式下过滤(隐藏/显示)ListView 中的项目的方法。我将我的项目缓存在列表视图项目数组中,我怎样才能有效地做到这一点,以便在按下过滤器按钮时只显示特定的列表视图项目,然后在按下非过滤器按钮时将它们全部返回?
【问题讨论】:
您需要映射您的可见行列表,这样当 RetrieveVirtualItem 请求一个项目时,它会请求到您的过滤列表中,该列表仅包含可见项目。
如果您使用 CacheVirtualItems 来存储 ListViewItems,则需要在应用过滤时更新该缓存,删除所有不可见的行。您可能只想在此时清除缓存以降低复杂性。
【讨论】:
我通过向我在 ListView 中显示的对象添加属性 FilterResult 来在我的项目中执行此操作。然后在用于 ListView 的项目模板中,我在 FilterResult 上放置了一个 DataTrigger,在 Visibility 上放置了一个 Setter,类似于:
<DataTrigger Binding="{Binding FilterResult}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
然后,当用户更改过滤器时,我只需通过显示的集合,更新每个 FilterResult(这是一个 PropertyChanged 通知属性),瞧! :=)
另一个仍然使用 FilterResult 标志的解决方案是创建一个连接到主集合的 NotifyingCollection,它只公开具有 FilterResult 为 true 的项目。因此,如果 FilterResult 的一项切换值,您必须管理 CollectionChanged 事件...
【讨论】: