根据C#中的搜索文本框文本将ListView CollectionViewSource滚动到一组项目

时间:2014-08-27 23:17:08

标签: c# xaml listview windows-phone-8.1

我正在使用XAML和C#中的Windows Phone 8.1应用程序。

我有一个listview,其商品来源设置为名为CollectionViewSource的{​​{1}}。在C#的后端,我有一个名为MusicSource的{​​{1}},下面的代码通过获取手机上的所有音乐文件,按艺术家分组然后将它们放入CollectionViewSource来填充它。在列表视图中显示它们:

ObservableCollection

以下是XAML方面:

source

所以我在listview中得到类似的内容:

迈克尔杰克逊

  • 危险
  • 惊悚

阿姆

  • 不怕?
  • 怪物

我有一个名为var folders = await folder.GetFoldersAsync(); if (folders != null) foreach (var fol in folders) await getMusic(fol); var files = await folder.GetFilesAsync(); foreach (var file in files) { MusicProperties musicProperties = await file.Properties.GetMusicPropertiesAsync(); this.source.Add(new Music((musicProperties.Artist.Length > 0) ? musicProperties.Artist : "Custom", (musicProperties.Title.Length > 0) ? musicProperties.Title : file.Name, (musicProperties.Album.Length > 0) ? musicProperties.Album : "Custom Album", file.Path)); } itemSource = AlphaKeyGroup<Music>.CreateGroups(source, CultureInfo.CurrentUICulture, s => s.Artist, true); this.MusicSource.Source = itemSource; 的文本框,用于搜索列表视图。

当我输入文本框时,列表视图会滚动到最近的组,其组标题与文本框中的文本匹配。因此,如果我输入“Em”,列表视图应立即向下滚动到“Eminem”类别的项目。

我将如何实现这一目标?

此外,是否可以做同样的事情,除了滚动到<Page.Resources> <DataTemplate x:Key="GroupTemplate"> <Grid Grid.Column="1"> <Grid.ColumnDefinitions> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Column="1"> <TextBlock x:Name="SongTitle" Text="{Binding Title}" Style="{ThemeResource ListViewItemTextBlockStyle}"/> <TextBlock x:Name="ArtistName" Text="{Binding Album}" Style="{ThemeResource ListViewItemContentTextBlockStyle}"/> </StackPanel> </Grid> </DataTemplate> <CollectionViewSource x:Name="MusicSource" IsSourceGrouped="true" /> <DataTemplate x:Key="headerTemplate"> <StackPanel HorizontalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=contentList}"> <TextBlock Text="{Binding Key}" /> </StackPanel> </DataTemplate> </Page.Resources> <Grid> <SemanticZoom> <SemanticZoom.ZoomedInView> <ListView x:Name="contentList" SelectionMode="Multiple" ItemsSource="{Binding Source={StaticResource MusicSource}}" ItemTemplate="{StaticResource GroupTemplate}"> <ListView.GroupStyle> <GroupStyle HidesIfEmpty="True" HeaderTemplate="{StaticResource headerTemplate}"/> </ListView.GroupStyle> </ListView> </SemanticZoom.ZoomedInView> </SemanticZoom> <Border x:Name="SearchBorder" Background="White"> <TextBox x:Name="Search" TextChanged="TextBox_TextChanged" /> </Border> </Grid> 属性与文本框中文本的属性匹配的项目?

2 个答案:

答案 0 :(得分:1)

哇,这是一个难题。我过去做过非常相似的事情。基本上你需要一个ObservableCollection集的AJAX解决方案。您可以通过在正则表达式匹配的帮助下通过AlphaKeyGroup编写搜索功能来实现此目的。这应该返回你需要滚动到的元素。

至于搜索每个文本更改,您需要将TextChanged事件附加到文本框中,如下所示:

<TextBox x:Name="my_search" TextChanged="my_search_TextChanged" Grid.Row="0" />

当找到匹配项时,您想要使用

滚动到该元素
contentList.ScrollIntoView(matching_element);



好的,发布了Windows Phone 8.1解决方案:ListView Searching Project

要点包括添加到GroupKey类的搜索例程。

public T FindMatch(string pattern, GetKeyDelegate getKey)
{
    Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);

    foreach (T item in this.Items)
    {
        string key = getKey(item);
        Match match = rgx.Match(key);
        if (match.Success)
            return item;
    }

    return default(T);
}

Screen Shot of Searching For What what

答案 1 :(得分:0)

设置ICollectionView.Filter回调,以便每次提出TextChanged事件时过滤您的列表视图:

private void TextBox_TextChanged(object sender, TextChangedEven)
    {
        ICollectionView view = lvTest.ItemsSource as ICollectionView;
        string txtToSearch = searchTextBox.Text;
        view.Filter = (p) => { return ((Music)p).ArtistName.Contains(txtToSearch); };
        view.Refresh();
    } 

这样,您可以避免在匹配多个艺术家名称时决定将当前项目设置在何处。