UWP - 使用分组过滤 ListView

UWP - Filtering ListView with grouping

我有一个带分组的 ListView。我想根据在 TextBox 中输入的文本显示此 ListView 中的项目。有很多关于过滤 ListViewCollectionViewSource 的教程,但它们适用于 WPF 而不是 UWP。我在做什么:

我的ListView:

    <ListView x:Name="ContactsListView"
              ItemTemplate="{StaticResource ContactsTemplate}"
              ItemsSource="{x:Bind ContactsViewSource.View}"
              SelectionMode="Single"
              ShowsScrollingPlaceholders="True" >

              <ListView.GroupStyle>
                 <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                       <DataTemplate x:DataType="data:GroupingItem">
                          <TextBlock Text="{x:Bind Key}"
                                     Foreground="Blue"
                                     Style="{ThemeResource TitleTextBlockStyle}"/>
                       </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                 </GroupStyle>
              </ListView.GroupStyle>
    </ListView>

我的CollectionViewSource定义在Page.Resources:

 <CollectionViewSource x:Name="ContactsViewSource"
                       x:Key="src"
                       IsSourceGrouped="True" />

我已经为 TextBox 创建了一个 textChanged 事件处理程序:

private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) {
    ....
    //here I filter ListView items and add them to CollectionViewSource
    ContactsViewSource.Source = filteredValues;
}

但没有变化。 ListView 没有刷新。我不知道该怎么办。我无法为 UWP.

找到此问题的任何解决方案

MainPage中分配数据时constructor显示数据。当我不在 constructor 中分配数据但在 SearchBox_TextChanged 中时,ListView 中没有显示数据。

请注意 x:Bind 默认行为是 OneTime! 因此它不会跟踪任何进一步的更改。

添加 x:Bind ContactsViewSource.View, Mode=OneWay 以确保其跟踪更改。

此外,我宁愿在 XAML 中添加 CollectionViewSource 的来源,例如

 <CollectionViewSource x:Name="ContactsViewSource"
                       x:Key="src"
                       Source="{x:Bind FilterdValues, Mode=OneWay}"
                       IsSourceGrouped="True" />

并将其添加为 属性 并让代码从 INotifyPropertyChanged 继承,以便您可以在代码中更改 FilterValues 而不是总是在代码中重新分配 ContactsViewSource.Source ...

您现在实施的解决方案没有利用 ListView 的内置动画 - 在每次文本更改后重置源将导致每次都出现一个全新的列表。

相反,您可以在每次文本更改后直接浏览 ListView 的 ItemsSource 和 remove/add 返回项。使用这种方法,单个项目将动画消失和出现。

Here's 最近在 Windows 开发文档上发表了一篇关于在 UWP 中过滤集合的文章。