Это зависит от реализации вашей обертки.Давайте создадим простой пример, добавив INotifyCollectionChanged
к BlockingCollection<T>
, разрешающему вызовы потоков, отличных от пользовательского интерфейса:
public void AddNotified(T item)
{
base.Add(item);
var args = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,
item,
Count - 1);
//Ensure no items are changed until the UI is updated
Application.Current.Dispatcher.Invoke(() =>
CollectionChanged?.Invoke(this, args));
}
Реализация Add
сама по себеПотокобезопасен, но для уверенности в том, что пользовательский интерфейс отображает текущие элементы, реализация которых вам необходима, чтобы гарантировать, что между добавлением и обновлением не будет никаких других элементов (см. комментарий в коде).
WPF обновляет пользовательский интерфейс на основеNotifyCollectionChangedAction
и обновленные предметы переданы при поднятии INotifyCollectionChanged.CollectionChanged
.Это означает, что пользовательский интерфейс полагается на эту информацию.Результат: временное обновление коллекции приводит к несинхронизированному пользовательскому интерфейсу до тех пор, пока не будет выполнено обновление или не будет вызван NotifyCollectionChangedAction.Reset
, и пользовательский интерфейс отображает различные элементы, как внутри вашей исходной коллекции.
Синхронизация коллекций с пользовательским интерфейсом оченьширокая и интересная тема.Уже есть несколько доступных решений, которые могут соответствовать вашей конкретной проблеме.Чтобы дать вам несколько возможных подходов к решению подобных проблем, взгляните на следующие ссылки: