ObservableCollection
because of exception "This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread" then I just figured out that: try to adding items to this collection "ObservableCollection
" out of the main thread, we will get the exception mentioned above. Searching around, found http://www.thomaslevesque.com/tag/mvvm/ this help me! Actually, I wanna to say big thanks Thomas to share his knowledge.Here are solutions: using
SynchronizationContext
since it is the one collection was created. Below is implementation:public
class
AsyncObservableCollection<T> : ObservableCollection<T>
{
private
SynchronizationContext _synchronizationContext = SynchronizationContext.Current;
public
AsyncObservableCollection()
{
}
public
AsyncObservableCollection(IEnumerable<T> list)
:
base
(list)
{
}
protected
override
void
OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if
(SynchronizationContext.Current == _synchronizationContext)
{
// Execute the CollectionChanged event on the current thread
RaiseCollectionChanged(e);
}
else
{
// Post the CollectionChanged event on the creator thread
_synchronizationContext.Post(RaiseCollectionChanged, e);
}
}
private
void
RaiseCollectionChanged(
object
param)
{
// We are in the creator thread, call the base implementation directly
base
.OnCollectionChanged((NotifyCollectionChangedEventArgs)param);
}
protected
override
void
OnPropertyChanged(PropertyChangedEventArgs e)
{
if
(SynchronizationContext.Current == _synchronizationContext)
{
// Execute the PropertyChanged event on the current thread
RaisePropertyChanged(e);
}
else
{
// Post the PropertyChanged event on the creator thread
_synchronizationContext.Post(RaisePropertyChanged, e);
}
}
private
void
RaisePropertyChanged(
object
param)
{
// We are in the creator thread, call the base implementation directly
base
.OnPropertyChanged((PropertyChangedEventArgs)param);
}
}
Note: instances of this class must be created on the UI thread (inside Dispatcher)
No comments:
Post a Comment