Обновление ObservableCollection с фоновым рабочим в MVVM

Хорошо, я недавно внедрил фоновый рабочий для сохранения и загрузки данных.

Однако, заставить его работать с командой сохранения оказалось трудным.

По сути, моя команда сохранения генерирует событие, которое уведомляет модель представления коллекции, что Item был добавлен и что элемент должен быть добавлен к его собственной ObservableCollection.

В этот момент я получаю обычное исключение, говорящее, что я НЕ могу обновить ICollection в другом потоке. Я попытался создать новый тип списка, который вызывает Dispatcher.Invoke , однако это все еще создает то же исключение.

Мне было интересно, есть ли у кого-нибудь еще какие-либо предложения о том, как лучше всего справиться с этим?

Поэтому в настоящее время у меня есть класс, который наследуется от ObservableCollection:

public class ThreadSafeObservableCollection<T> : ObservableCollection<T>
{
    public ThreadSafeObservableCollection(List<T> collection)
        : base(collection)
    {
        dispatcher = Dispatcher.CurrentDispatcher;
        rwLock = new ReaderWriterLock();
    }

    protected override void InsertItem(int index, T item)
    {
        if (dispatcher.CheckAccess())
        {
            if (index > this.Count)
                return;
            LockCookie c = rwLock.UpgradeToWriterLock(-1);
            base.InsertItem(index, item);
            rwLock.DowngradeFromWriterLock(ref c);
        }
        else
        {
            object[] obj = new object[] { index, item };
            dispatcher.Invoke(
                DispatcherPriority.Send, 
                (SendOrPostCallback)delegate { InsertItemImpl(obj); }, 
                obj);
        }
    }

Затем у меня есть класс модели представления, в котором есть фоновый рабочий, который выполняет сохранение.

Как только сохранение завершено, событие запускается в другую модель представления, чтобы обновить свой список.

    protected override void OnObjectAddedToRepository(object sender, ObjectEventArgs<cdAdministrators> e)
    {
        Dispatcher x = Dispatcher.CurrentDispatcher;
        var viewModel = new AdministratorViewModel(e.EventObject, DataAccess);
        viewModel.RecentlyAdded = true;
        viewModel.ItemSelected += this.OnItemSelected;
        this.AllViewModels.Add(viewModel);
        RecentlyAddedViewModel = viewModel;

        OnPropertyChanged(null);
    }

Оба списка создаются отдельным фоновым рабочим потоком.

10
задан mungflesh 20 October 2017 в 14:12
поделиться