В нашем приложении у нас есть TreeView связанный с ObservableCollection, который мы регулярно обновляем в фоновом потоке, запрашивая данные из нашего хранилища. Он отлично работает!
Охватывает. Я был неверно проинформирован =))
Правильно, мы на самом деле подклассифицируем ObservableCollection<T>
и переопределяем метод OnCollectionChanged
, чтобы исключить исключение перекрестной интерпретации пользовательского интерфейса. Мы используем this solution:
public class MTObservableCollection<T> : ObservableCollection<T>
{
public override event NotifyCollectionChangedEventHandler CollectionChanged;
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
var eh = CollectionChanged;
if (eh != null)
{
Dispatcher dispatcher = (from NotifyCollectionChangedEventHandler nh in eh.GetInvocationList()
let dpo = nh.Target as DispatcherObject
where dpo != null
select dpo.Dispatcher).FirstOrDefault();
if (dispatcher != null && dispatcher.CheckAccess() == false)
{
dispatcher.Invoke(DispatcherPriority.DataBind, (Action)(() => OnCollectionChanged(e)));
}
else
{
foreach (NotifyCollectionChangedEventHandler nh in eh.GetInvocationList())
nh.Invoke(this, e);
}
}
}
}
Без переопределёны вы получите исключение, как этого
System.NotSupportedException: Этот типа CollectionView не поддержки изменения в его SourceCollection из нить отличается от Диспетчерской нити.
Теперь единственная проблема, которую мы имеем в выбранную позицию элемента, в некоторых случаях, если выбранный элемент будет удален из инкассо TreeView перемещает выделение на следующий элемент (который вызывает некоторые другие ненужные действия пользовательского интерфейса в нашем приложение). Но это небольшая проблема.
Возможная альтернатива http://stackoverflow.com/questions/12881489/asynchronously-adding-to-observablecollection-or-an-alternative – Narkha
Или вы можете попробовать это, которое прекрасно отвечает потоку, работает из любой темы и может быть databound несколькими потоками пользовательского интерфейса: http://www.codeproject.com/Articles/64936/Multithreaded-ObservableImmutableCollection – Anthony
Хорошая работа в коллекции !! –