我有ListView
分组。我想根据输入ListView
的文字显示此TextBox
中的项目。有许多关于过滤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" />
我为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
中不会显示任何数据。
答案 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中过滤集合的文章。