UWP - 使用分组过滤 ListView
UWP - Filtering ListView with grouping
我有一个带分组的 ListView
。我想根据在 TextBox
中输入的文本显示此 ListView
中的项目。有很多关于过滤 ListView
和 CollectionViewSource
的教程,但它们适用于 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 中过滤集合的文章。
我有一个带分组的 ListView
。我想根据在 TextBox
中输入的文本显示此 ListView
中的项目。有很多关于过滤 ListView
和 CollectionViewSource
的教程,但它们适用于 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 中过滤集合的文章。