Windows 8 CollectionViewSource ObservableCollection绑定未更新

时间:2012-08-19 17:55:11

标签: c# xaml windows-8 windows-runtime

我有一个CollectionViewSource,它绑定到一个可观察集合的子集,以显示主页面上的前n篇文章。

<CollectionViewSource
        x:Name="groupedItemsViewSource"
        Source="{Binding Groups}"
        IsSourceGrouped="true"
        ItemsPath="TopItems" />

在我的代码中,我执行以下操作:

protected async override void LoadState(Object navigationParameter, ...)
{
    var feedDataSource = (FeedDataSource)navigationParameter;
    this.DefaultViewModel["Groups"] = feedDataSource.Feeds;
}

我的FeedDataSource包含一个ObservableCollection<FeedCategory> Feeds,其中包含ObservableCollection<FeedItem> Items和TopItems:

public ObservableCollection<FeedItem> TopItems
{
    get { return new ObservableCollection<FeedItem>(this.Items.Take(5)); }
}

现在 - 我添加了一个刷新方法,它将更多的FeedItems添加到Items集合中,但是当我刷新时,它对我的​​主页面上的网格视图没有任何影响,该主页面使用了distributedItemsViewSource作为其ItemsSource属性。

ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"

如果我离开页面,然后再返回(因此页面重建),新项目就在那里。为什么我的GridView不会显示这些变化?我认为通过绑定集合和网格视图,他们应该反映这些变化?我曾尝试将它们改为两种,一种方式 - 但它没有任何区别。

任何人都可以解释为什么这不起作用?

2 个答案:

答案 0 :(得分:5)

在TopItems属性中,您将返回一个新的ObservableColleciton,其中包含Items Collection中的前五个Item。 CollectionViewSource绑定到这个新的ObservableCollection,而不是绑定到原始Items集合。因此,当您更新Items集合时,不会绑定任何内容以接收更新通知。您需要绑定到原始Items集合,或者在使用新数据更新Items集合的方法中,为TopItems属性触发PropertyChanged事件。

答案 1 :(得分:3)

你应该能够听CollectionChanged ObservableCollection上的Items事件去做你想要的事情。

this.Items = new ObservableCollection<FeedItem>();
this.Items.CollectionChanged += delegate { base.OnPropertyChanged("TopItems"); };

现在,当Items集合更改时,绑定魔术师会注意到它还应评估TopItems属性的更改。