c# - 基于 C# 中搜索文本框的文本将 ListView CollectionViewSource 滚动到一组项目

标签 c# xaml listview windows-phone-8.1

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

我有一个 ListView ,其项目源设置为名为 MusicSourceCollectionViewSource。在 C# 的后端,我有一个名为 sourceObservableCollection,下面的代码通过获取手机上的所有音乐文件来填充它,按艺术家分组,然后放入它们在 CollectionViewSource 中,在 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;

以下是它的 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>

所以我在 ListView 中得到如下内容:

迈克尔 jackson

  • 不好
  • 危险
  • 惊悚片

阿姆

  • 不害怕
  • 怪物

我有一个名为 search 的文本框,用于搜索 ListView 。

应该发生的是,当我在文本框中键入内容时, ListView 会滚动到最近的组,该组的组标题与文本框中的文本相匹配。因此,如果我键入“Em”, ListView 应立即向下滚动到项目的“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 解决方案: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

关于c# - 基于 C# 中搜索文本框的文本将 ListView CollectionViewSource 滚动到一组项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538411/

相关文章:

c# - Visual C# Directory.GetDirectories 问题 - "The specified server cannot perform the requested operation"

c# - 使用 ClickOnce 使桌面图标模糊

c# - 在控件类型上设置样式不起作用

wpf - 如何将背景图像设置为 Canvas

silverlight - SL4。 ElementName 绑定(bind)在 DataTemplate 中不起作用

android - smoothScrollToPositionFromTop 忽略持续时间参数

C#MVC : Optional columns in grid (foreach)

c# - 以英语以外的特定语言获取 ASP.NET Core 模型错误

android - fragment 中的 OnItemClickListener 不起作用

c# - 如何使 WPF ListView 水平,包含的图像被拉伸(stretch)以适应高度?