Windows Phone CollectionViewSort没有显示任何内容

我正在尝试在WP8应用程序中开发一个页面,该应用程序顶部有一个搜索框,以及与下面的搜索匹配的项目列表,随着搜索框的更新而更新。 很简单,对吧? 除了我不能让它工作。

在仔细阅读StackOverflow和interwebz之后,推荐的解决方案似乎是使用CollectionViewSource 。 好吧,我正在尝试使用它,没有任何项目出现。 一旦我切换到包含我在XAML中的项目的ObservableCollection ,一切都显示正常。

我的数据是从数据库异步加载的。

XAML

              

查看模型

 public class MyViewModel { private ObservableCollection _allItems = new ObservableCollection(); public CollectionViewSource SearchResults { get; private set; } public MyViewModel() { SearchResults = new CollectionViewSource { Source = _allItems }; _allItems.CollectionChanged += (_, __) => SearchResults.View.Refresh(); LoadAllItemsAsync(); } private async void LoadAllItemsAsync() { IList models = await LoadMyModels(); _allItems.AddRange(models.Select(model => new MyItemViewModel(model))); } } 

如您所见,我甚至还没有尝试编写过滤代码。 不应该上面的代码基本上显示一个LongListSelector与我已加载的所有项目? 如果我将SearchResults类型更改为ObservableCollection并让getter返回_allItems ,则我的页面会显示预期的项目。 我在这做错了什么?

问题是LongListSelector控件要求其ItemsSource实现IList ,而CollectionViewSource不会这样做。 这意味着您无法将CollectionViewSource绑定到LongListSelector即用的LongListSelector 。 您可以通过尝试在代码隐藏文件中设置它来看到这一点,如下所示:

 myLongListSelector.ItemsSource = myCollectionViewSource.View; 

这给出了一个错误,说它无法将视图转换为IList

我知道至少有两个解决方案,一个是围绕CollectionViewSource编写一个包装类,它实现了IList然后绑定到它。 另一个问题给出了一个例子(我没想过): 在Windows Phone 7或Windows Phone 8中使用CollectionView进行LongListSelector分组

另一种方法是不使用CollectionViewSource ,而是使用System.Linq进行排序,如下所示: 如何在Windows Phone中对LongListSelector进行排序