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

Другие вопросы по тегам