将SQLite表用作ItemSource时,为什么Xamarin.Forms CollectionView SelectedItems在SearchBar查询后仍不突出显示?

问题描述

在使用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和新列表之间重新建立链接

是否应该在每次搜索时对sqlite表进行新的调用

相反,我应该在启动时将所有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>