UWP - 使用分组过滤ListView

时间:2016-01-18 21:03:08

标签: listview windows-10 uwp collectionviewsource

我有ListView分组。我想根据输入ListView的文字显示此TextBox中的项目。有许多关于过滤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>

我的CollectionViewSourcePage.Resources中定义:

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

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

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中不会显示任何数据。

2 个答案:

答案 0 :(得分:5)

请注意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 ...

答案 1 :(得分:0)

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

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

Here's最近在Windows Dev Docs上发表了有关在UWP中过滤集合的文章。