我正在使用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>
属性与文本框中文本的属性匹配的项目?
答案 0 :(得分:1)
至于搜索每个文本更改,您需要将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);
}
答案 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();
}
这样,您可以避免在匹配多个艺术家名称时决定将当前项目设置在何处。