Вы можете подкласс ObservableCollection и переопределить OnCollectionChanged и OnPropertyChanged методы Маршалла события обратно в поток пользовательского интерфейса с использованием correspending диспетчера.
public class DispatcherObservableCollection<T> : ObservableCollection<T>
{
Dispatcher _dispatcher;
public DispatcherObservableCollection(Dispatcher dispatcher)
{
if (dispatcher == null)
throw new ArgumentNullException("dispatcher");
_dispatcher = dispatcher;
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (!_dispatcher.CheckAccess())
{
_dispatcher.Invoke(
new Action<PropertyChangedEventArgs>(base.OnPropertyChanged), e);
}
else
{
base.OnPropertyChanged(e);
}
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!_dispatcher.CheckAccess())
{
_dispatcher.Invoke(
new Action<NotifyCollectionChangedEventArgs>(base.OnCollectionChanged), e);
}
else
{
base.OnCollectionChanged(e);
}
}
}
Спасибо, но у меня много происходит в фоновом режиме (например, операции загрузки асинхронных сообщений и т. Д.). Любые другие идеи? – Derick
Я дам ваше предложение. – Derick
@Derick - это красота этой функции - неважно, на какой поток вы ее назовете, она будет маршировать на поток пользовательского интерфейса (если он еще не существует), прежде чем он обновит. – slugster