2016-01-18 71 views
0

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

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,我无法找到解决此问题的任何解决方案。

当在MainPageconstructor中分配数据时,它正在显示数据。当我没有在constructor中分配数据,而是在SearchBox_TextChanged中时,ListView中没有显示数据。

回答

4

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

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

而且,我宁愿加CollectionViewSource的来源XAML像

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

并补充说,作为一个属性,让代码从INotifyPropertyChanged所以继承您可以更改代码FilterValues,而不是总在代码中重新分配ContactsViewSource.Source ...

-1

尝试使用绑定而不是x:绑定。