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进行排序