#wpf #multithreading #mvvm
#wpf #многопоточность #mvvm
Вопрос:
У меня есть окно (форма Windows), в котором у меня есть два пользовательских элемента управления WPF отдельно от других элементов управления.
Один пользовательский элемент управления имеет список элементов (имен) с доступным флажком сбоку. В другом есть описание элементов (некоторые картинки и другие детали).
Оба пользовательских элемента управления имеют свои модели представления
Пользователь может устанавливать и снимать флажки в первом пользовательском элементе управления. В зависимости от его выбора детали элементов добавляются / удаляются во 2-й пользовательский элемент управления.
Мы получаем все данные из базы данных. Итак, сначала для заполнения мы извлекаем данные из базы данных. Мы также сохраняем выбор / отмену выбора пользователя обратно в базу данных. 2-й пользовательский элемент управления также должен обновлять данные из базы данных. Мы ничего не храним в памяти.
Что должно произойти, так это то, что когда пользователь выбирает / отменяет выбор в первом usercontrol, он должен быть добавлен во 2-й пользовательский элемент управления. Итак, операция: сохранить или удалить выделение в базе данных -> Отправить запрос на 2-й пользовательский элемент управления, чтобы обновить его коллекцию, считывающую данные из базы данных.
Я использую объект диспетчера первого usercontrol (вызывается из обработчика событий в 1-й модели представления пользовательского элемента управления) и вызываю метод в родительской форме (форме контейнера Windows). Затем эта родительская форма вызывает обновление модели представления 2-го пользовательского элемента управления, которая обновляет 2-й пользовательский элемент управления.
Проблема в том, что пользовательский интерфейс 1-го пользовательского элемента управления зависает до завершения всего этого процесса. Вместо этого я хочу, чтобы пользовательский интерфейс 1-го пользовательского элемента управления не зависал. Причина в том, что пользовательский интерфейс 1-го элемента управления не должен ждать обновления операции во 2-м пользовательском элементе управления. Обновление 2-го представления может быть поставлено в очередь.
Итак, в основном я хочу, чтобы, когда пользователь выбирает / снимает флажки, просто отправлял уведомление (для обновления 2-го пользовательского элемента управления) и продолжал мой пользовательский элемент управления, а не ждал.
Я пробовал фоновый рабочий, но, похоже, ничего не работает.
Любая помощь приветствуется.
- Girija
Ответ №1:
если вы можете создать экземпляр ViewModel, который используется обоими представлениями, вы, вероятно, сможете избежать необходимости выполнять какое-либо кодирование уведомлений.
Если вам нужно сохранить виртуальную машину отдельно, то, если у вас есть какой-то механизм событий в вашем коде, это поможет. Например, если вы используете Unity, EventAggregator можно использовать для отправки уведомлений, это позволит обойти родительскую форму, и ваша вторая viewmodel должна иметь возможность обновляться без необходимости находиться в потоке GUI.
Быстрая, но вряд ли работающая вещь, которую нужно попробовать (я говорю маловероятно, потому что я не смог получить от этого никаких преимуществ в производительности)
using (Dispatcher.CurrentDispatcher.DisableProcessing())
{
//notification code here
}
И, конечно, если ваша вторая ViewModel откуда-то собирает данные, убедитесь, что она асинхронна.