数据绑定ListView多选和过滤

时间:2012-01-11 21:51:31

标签: c# wpf data-binding

我有一个数据绑定项目列表。

我有一个文本框,通过将它们的可见性绑定到描述是否包含键入的文本,即时过滤它们。这也绑定到'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”不可见。如果在应用过滤器之前选择了所有三个,则同样适用。

我在这里找到了一个试图解决这个问题的例子,但是,它并没有完全奏效。如果在应用过滤器之前选择了项目,它将适用,但如果在之后选择了相同的问题,则会适用。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

ListView将为您馆藏中的每个对象创建ListViewItem。仅仅因为可见性设置为隐藏并不意味着该项目不在列表视图中。当您按住Shift键选择项目时,它会选择两者之间的所有项目 - 包括“Bob”(可见或不可见)。

要进行正确的收集过滤,您应该使用Filter的{​​{1}}属性。关于如何做到的一个示例是这个问题中接受的答案:Trigger Filter on CollectionViewSource

修改

您的过滤速度可能很慢的原因有很多。对于您可以查看的内容,此问题有一些建议:WPF's ICollectionView.filter with large sets of data

如果这没有用,那么可以在SO上提出另一个问题(你应该提供你如何进行过滤和listview数据绑定的代码)。