问题描述
在使用SearchBar或有时离开页面时,我一直在努力使我的库存清单保持突出显示的项目一致。我从MS Docs的“ Xamarin.Forms CollectionView选择:多个预先选择”中看到了一个漂亮的示例
我带了这个SearchBar示例: https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/userinterface-searchbardemos/
我已经修改了带有MVVM的Xaml页面,使其看起来更像我的项目:https://github.com/BullCityCabinets/MyXFMultiSelectExample-2001005
令人沮丧的是...修改后的示例有效!我从@Jason收集到,我将完全替换视图的ItemSource,并且绑定不知道如何识别对象的新实例。比较:
MS Docs示例数据源是一个公共的静态ObservableCollection
public static class DataService
{
public static ObservableCollection<string> Fruits { get; } = new ObservableCollection<string>
{ "Akee","Apple",etc...
public static ObservableCollection<string> GetSearchResults(string queryString)
{
var normalizedQuery = queryString?.ToLower() ?? "";
var myList = Fruits.Where(f => f.ToLowerInvariant().Contains(normalizedQuery)).ToList();
var myOC = new ObservableCollection<string>();
foreach (var f in myList)
{ myOC.Add(f); }
return myOC;
}
我的数据源是一个包含约350个对象的单个sqlite表,在搜索时我将其称为:
public Task<List<MyInventoryClass>> GetInventoryByQuery(string query)
{
return Db.Table<MyInventoryClass>()
.Where(i =>
i.Name1.ToLower().Contains(query.ToLower()) == true)
.ToListAsync();
}
对象上有一个自动递增的Id属性,因此我需要搜索...我只是不确定如何在SelectedItems和新列表之间重新建立链接。
相反,我应该在启动时将所有350个项目保存在静态属性中,然后从中显示查询吗?如果有3500个对象,那肯定不是最好的解决方案,对吗?
如何以及在何处插入foreach以将现有的SelectedItems列表加入新查询的CollectionView ItemSource? SelectedItems列表中的对象具有唯一的ID属性,因此除了索引号(在MS Docs预选示例中可见)之外,还有一些用于标识项的对象。
解决方法
选择后要从CollectionView中删除突出显示时,如果使用GridItemsLayout
<ContentPage.Resources>
<Style TargetType="Grid">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonState">
<VisualState x:Name="Normal" />
<VisualState x:Name="Selected">
<VisualState.Setters>
<Setter
Property="BackgroundColor"
Value="White" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
</ContentPage.Resources>