I have a CollectionViewSource that is binding to an subset of an observable collection to show the top n articles on the main page.
<CollectionViewSource
x:Name="groupedItemsViewSource"
Source="{Binding Groups}"
IsSourceGrouped="true"
ItemsPath="TopItems" />
In my code I do the following:
protected async override void LoadState(Object navigationParameter, ...)
{
var feedDataSource = (FeedDataSource)navigationParameter;
this.DefaultViewModel["Groups"] = feedDataSource.Feeds;
}
My FeedDataSource contains an ObservableCollection<FeedCategory> Feeds
which has an ObservableCollection<FeedItem> Items
and TopItems :
public ObservableCollection<FeedItem> TopItems
{
get { return new ObservableCollection<FeedItem>(this.Items.Take(5)); }
}
Now - I have added a refresh method which adds more FeedItems to the Items collection however when I refresh, it has no effect on the Grid View on my main page which uses the groupedItemsViewSource for it's ItemsSource property.
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
If I navigate away from the page, and then back again (so the page gets rebuilt) the new items are there. Why isn't my GridView showing these changes as they happen? I thought that by binding the collection and grid view they should reflect these changes? I have tried changing them to two one, one way - but it makes no difference.
Can anyone shed some light as to why this isn't working?
In your TopItems property, you are returning a new ObservableColleciton that contains the first five Items from the Items Collection. The CollectionViewSource is binding to this new ObservableCollection, not to the orginal Items collection. So when you update the Items collection, nothing is bound to it to receive the update notification. You either need to bind to the original Items collection, or, in the method that updates the Items collection with new data, fire a PropertyChanged event for the TopItems property.
You should be able to listen to the CollectionChanged
event on the Items
ObservableCollection to do what you're asking.
this.Items = new ObservableCollection<FeedItem>();
this.Items.CollectionChanged += delegate { base.OnPropertyChanged("TopItems"); };
Now when the Items
collection changes the binding magician will notice that it should also evaluate the TopItems
property for changes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With