Windows Phone CollectionViewSort ничего не показывает
Я пытаюсь создать страницу в приложении WP8, в верхней части которого находится окно поиска и список элементов, соответствующих поиску ниже, которые обновляются по мере обновления окна поиска. Довольно просто, правда? За исключением того, что я не могу заставить его работать.
После просмотра Stackru и interwebz, рекомендуемое решение, кажется, использовать CollectionViewSource
, Хорошо, я пытаюсь использовать это, и никакие пункты не обнаруживаются. Как только я переключусь на ObservableCollection
Содержит мои предметы в XAML, все выглядит хорошо.
Мои данные загружаются асинхронно из БД.
XAML
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<toolkit:PhoneTextBox Grid.Row="0" Hint="search query" ActionIcon="/Assets/Search.png" Text="{Binding SearchQuery, Mode=TwoWay}">
<i:Interaction.Behaviors>
<themes:TextBoxUpdateOnTextChangedBehavior />
</i:Interaction.Behaviors>
</toolkit:PhoneTextBox>
<phone:LongListSelector Grid.Row="1" ItemsSource="{Binding SearchResults}" />
<!-- I have also tried binding to SearchResults.View with no success -->
</Grid>
Посмотреть модель
public class MyViewModel
{
private ObservableCollection<MyItemViewModel> _allItems = new ObservableCollection<MyItemViewModel>();
public CollectionViewSource SearchResults { get; private set; }
public MyViewModel()
{
SearchResults = new CollectionViewSource { Source = _allItems };
_allItems.CollectionChanged += (_, __) => SearchResults.View.Refresh();
LoadAllItemsAsync();
}
private async void LoadAllItemsAsync()
{
IList<MyItemModel> models = await LoadMyModels();
_allItems.AddRange(models.Select(model => new MyItemViewModel(model)));
}
}
Как видите, я даже не пытался написать код фильтрации. Разве приведенный выше код не должен показывать LongListSelector со всеми загруженными элементами? Если я изменю SearchResults
введите в ObservableCollection<MyItemViewModel>
и получить возврат геттера _allItems
На моей странице показаны ожидаемые предметы. Что я здесь не так делаю?
1 ответ
Проблема в том, что LongListSelector
контроль требует, чтобы его ItemsSource
инвентарь IList
, который CollectionViewSource не делает. Это означает, что вы не можете связать CollectionViewSource
к LongListSelector
из коробки. Вы можете увидеть это, попытавшись установить его в файле с выделенным кодом следующим образом:
myLongListSelector.ItemsSource = myCollectionViewSource.View;
Что дает ошибку, говоря, что он не может преобразовать представление в IList
,
Я знаю, по крайней мере, два решения этого вопроса, одно из них - написать класс-оболочку для CollectionViewSource, который реализует IList, а затем привязать к нему. Другой вопрос приводит пример этого (я не пробовал, подумал): группировка LongListSelector с использованием CollectionView в Windows Phone 7 или Windows Phone 8
Другой метод заключается в том, чтобы не использовать CollectionViewSource
и вместо того, чтобы использовать System.Linq
для сортировки как предложено в этом вопросе: Как Сортировать LongListSelector в Windows Phone