#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. Спасибо, но я собирался «Оставаться выделенным», а не «Удалить выделение».