Listview UWP-分组过滤列表视图

Listview UWP-分组过滤列表视图,listview,windows-10,uwp,collectionviewsource,Listview,Windows 10,Uwp,Collectionviewsource,我有一个带有分组的列表视图。我想根据输入到TextBox的文本显示此列表视图中的项目。有许多关于过滤列表视图和集合视图源的教程,但它们是针对WPF而不是UWP。我在做什么: 我的列表视图: <ListView x:Name="ContactsListView" ItemTemplate="{StaticResource ContactsTemplate}" ItemsSource="{x:Bind ContactsViewSo

我有一个带有分组的
列表视图。我想根据输入到
TextBox
的文本显示此
列表视图中的项目。有许多关于过滤
列表视图
集合视图源
的教程,但它们是针对
WPF
而不是
UWP
。我在做什么:

我的
列表视图

    <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>
我已经为
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
中分配数据时,它会显示数据。当我没有在
构造函数中分配数据时,但在
搜索框中,文本已更改
列表视图中没有显示数据时,请注意
x:Bind
默认行为是
OneTime
! 所以它不会跟踪任何进一步的变化

添加
x:Bind contacts viewsource.View,Mode=OneWay
以确保跟踪更改

另外,我更愿意像这样在XAML中添加CollectionViewSource的源代码

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


并将其作为属性添加,并让代码继承自INotifyPropertyChanged,这样您就可以在代码中更改该FilterValue,而不是始终重新分配ContactsViewSource.Source在代码中…

请注意,
x:Bind
默认行为是
OneTime
! 所以它不会跟踪任何进一步的变化

添加
x:Bind contacts viewsource.View,Mode=OneWay
以确保跟踪更改

另外,我更愿意像这样在XAML中添加CollectionViewSource的源代码

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


并将其作为属性添加,让代码继承自INotifyPropertyChanged,这样您就可以在代码中更改该FilterValue,而不是始终重新分配ContactsViewSource.Source in code…

您现在实现的解决方案不会利用ListView的内置动画-重置每次文本更改后,source将导致每次出现一个全新的列表

相反,您可以直接浏览ListView的ItemsSource,并在每次文本更改后删除/添加回项。使用此方法,单个项目将设置动画以消失和显示


最近在Windows Dev Docs上发表了一篇关于在UWP中过滤集合的文章。

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

相反,您可以直接浏览ListView的ItemsSource,并在每次文本更改后删除/添加回项。使用此方法,单个项目将设置动画以消失和显示


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

“注意,x:Bind默认行为是一次性的”
“-OMG!谢谢,最近搬到UWP后,我没有意识到这一点。谢谢-you@MickyD一定要把这个放在帽子里。这是所有元素源绑定的行为。@michaelg我会的,谢谢:)“注意,x:Bind的默认行为是
OneTime
”-OMG!谢谢,最近搬到UWP后,我没有意识到这一点。谢谢-you@MickyD一定要把这个放在帽子里。这是所有元素源绑定的行为。@michaelg我会的,谢谢:)