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

2023-12-28

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

我有一个列表视图,其项目源设置为CollectionViewSource called MusicSource。在 C# 的后端,我有一个ObservableCollection called source以下代码通过获取手机上的所有音乐文件来填充它,按艺术家对其进行分组,然后将它们放入 CollectionViewSource 中,这会在列表视图中显示它们:

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;

以下是它的 XAML 方面:

<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>

所以我在列表视图中得到类似以下内容:

迈克尔杰克逊

  • Bad
  • 危险的
  • Thriller

Eminem

  • 不怕
  • 怪物

我有一个带有名称的文本框search这是为了搜索列表视图。

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

我将如何实现这一目标?

另外,是否可以做同样的事情,除了滚动到其项目songTitle属性与文本框中的文本匹配吗?


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

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

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

当它找到匹配项时,您想要滚动到该元素

contentList.ScrollIntoView(matching_element);

好的,发布 Windows Phone 8.1 解决方案:

亮点包括添加到 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);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐