我有一个数据绑定项目列表。
我有一个文本框,通过将它们的可见性绑定到描述是否包含键入的文本,即时过滤它们。这也绑定到'focusable'属性,以删除因过滤器而不可见的所选项目。
ListBoxItems的DataTrigger:
<DataTrigger Value="False">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource filterToBoolean}">
<Binding Path="Description" />
<Binding ElementName="txtFilter" Path="Text" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Collapsed" />
<Setter Property="Focusable" Value="False" />
</DataTrigger>
我的问题出现在以下场景中。假设我们有三个项目(Joe,Bob,Jacob)。
如果我们在过滤器中输入“J”然后选择“Joe”并按住Shift并单击“Jacob”,则会选择三个项目(所有这些项目),即使“Bob”不可见。如果在应用过滤器之前选择了所有三个,则同样适用。
我在这里找到了一个试图解决这个问题的例子,但是,它并没有完全奏效。如果在应用过滤器之前选择了项目,它将适用,但如果在之后选择了相同的问题,则会适用。
提前感谢您的帮助。
答案 0 :(得分:2)
ListView
将为您馆藏中的每个对象创建ListViewItem
。仅仅因为可见性设置为隐藏并不意味着该项目不在列表视图中。当您按住Shift键选择项目时,它会选择两者之间的所有项目 - 包括“Bob”(可见或不可见)。
要进行正确的收集过滤,您应该使用Filter
的{{1}}属性。关于如何做到的一个示例是这个问题中接受的答案:Trigger Filter on CollectionViewSource
修改强>
您的过滤速度可能很慢的原因有很多。对于您可以查看的内容,此问题有一些建议:WPF's ICollectionView.filter with large sets of data
如果这没有用,那么可以在SO上提出另一个问题(你应该提供你如何进行过滤和listview数据绑定的代码)。