9

メインページに上位n個の記事を表示するために、監視可能なコレクションのサブセットにバインドするCollectionViewSourceがあります。

<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は、 と TopItems を持つ が含まれていますObservableCollection<FeedItem> Items:

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

ここで、Items コレクションに FeedItems を追加する更新メソッドを追加しましたが、更新すると、ItemsSource プロパティに groupedItemsViewSource を使用するメイン ページのグリッド ビューには影響しません。

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

ページから離れてから再び戻ると(ページが再構築されるため)、新しいアイテムがそこにあります。これらの変更が発生したときに GridView に表示されないのはなぜですか? コレクションとグリッドビューをバインドすることで、これらの変更を反映する必要があると思いましたか? 私はそれらを2つの1つの方法に変更しようとしましたが、違いはありません.

なぜこれが機能しないのか、誰かが光を当てることができますか?

4

2 に答える 2

5

TopItemsプロパティで、Itemsコレクションの最初の5つのItemを含む新しいObservableCollecitonを返します。CollectionViewSourceは、元のItemsコレクションではなく、この新しいObservableCollectionにバインドされています。したがって、Itemsコレクションを更新する場合、更新通知を受信するためにコレクションにバインドされるものはありません。元のItemsコレクションにバインドするか、Itemsコレクションを新しいデータで更新するメソッドで、TopItemsプロパティのPropertyChangedイベントを発生させる必要があります。

于 2012-08-19T18:02:09.123 に答える
3

ObservableCollectionでCollectionChangedイベントをリッスンして、求めていることを実行できるはずです。Items

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

コレクションが変更されると、バインディング マジシャンは、プロパティの変更Itemsも評価する必要があることに気付くでしょう。TopItems

于 2012-08-27T01:31:24.187 に答える