Почему не Xamarin.Выбранные элементы Forms CollectionView остаются выделенными после запроса панели поиска при использовании таблицы SQLite в качестве источника элементов?

#sqlite #xamarin.forms #collectionview #selecteditem

#sqlite #xamarin.forms #collectionview #selecteditem

Вопрос:

Я изо всех сил пытался заставить свои списки инвентаря поддерживать согласованные выделенные элементы при использовании панели поиска или иногда при переходе со страницы. Я вижу этот отличный образец из MS Docs «Xamarin.Выбор вида коллекции форм: множественный предварительный выбор»

И я взял этот пример панели поиска: https://learn.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/userinterface-searchbardemos/

И я изменил страницу Xaml с / MVVM, чтобы она больше походила на мой проект: 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;
    }
  

Мой источник данных — это одна таблица SQLite, содержащая около 350 объектов, и при поиске я называю это:

 public Task<List<MyInventoryClass>> GetInventoryByQuery(string query)
    {
        return Db.Table<MyInventoryClass>()                
            .Where(i => 
            i.Name1.ToLower().Contains(query.ToLower()) == true)
            .ToListAsync();            
    }
  

Для объектов есть автоматически увеличивающееся свойство Id, поэтому мне есть что искать… Я просто не уверен, как восстановить связь между выбранными элементами и новым списком.

Должен ли я выполнять новый вызов таблицы SQLite каждый раз, когда выполняется поиск?

Должен ли я вместо этого сохранить все 350 элементов в статическом свойстве при запуске, а затем отображать запросы из него? Что, если бы было 3500 объектов, конечно, это не лучшее решение, не так ли?

Как и где вы вставляете foreach, чтобы присоединить существующий список выбранных элементов к только что запрошенному источнику элементов CollectionView? Объекты в списке выбранных элементов имеют уникальные свойства идентификатора, поэтому есть что-то, что идентифицирует элементы, помимо номеров индексов (см. в примере предварительного выбора MS Docs).

Комментарии:

1. Я загружаю проект по указанной вами ссылке. Проект Mokeys хорошо работает SelectedItems с. Вы что-то изменили в примере кода? Не могли бы вы предоставить мне скриншот?

2. Сегодня я опубликую пример проекта! Спасибо.

Ответ №1:

Когда я хочу удалить выделение из 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>
  

Комментарии:

1. Спасибо, но я собирался «Оставаться выделенным», а не «Удалить выделение».