Обновить два отдельных интерфейса в отдельных потоках, WPF - PullRequest
2 голосов
/ 04 ноября 2011

У меня есть окно (форма Windows), где у меня есть два пользовательских элемента управления WPF, кроме других элементов управления.

Один пользовательский элемент управления имеет список элементов (имен) с доступным флажком вдоль стороны. У другого есть описание предметов (некоторые картинки и другие детали).

Оба пользовательских элемента управления имеют свои модели просмотра

Пользователь может устанавливать и снимать флажки в первом пользовательском элементе управления. На основании его выбора, детали предметов добавляются / удаляются во второй пользовательский элемент управления.

Мы получаем все данные из базы данных. Итак, изначально для заполнения мы получаем данные из базы данных. Мы также сохраняем выбор / отмена выбора пользователя обратно в базу данных. Второй пользовательский элемент управления также должен обновить данные из базы данных. Мы ничего не храним в памяти.

Что должно произойти, так это то, что когда пользователь выбирает / отменяет выбор в первом пользовательском контроле, он должен быть добавлен во второй пользовательский элемент управления. Итак, операция: Сохранить или удалить выборку в базе данных -> Отправить запрос второму пользовательскому элементу управления, чтобы обновить его коллекцию, считывая данные из базы данных.

Я использую объект Dispatcher первого пользовательского элемента управления (вызывается из обработчика событий в модели представления 1-го пользовательского элемента управления) и вызываю метод в родительской форме (форма контейнера Windows). Затем эта родительская форма вызывает обновление 2-й модели представления пользовательского элемента управления, которая обновляет 2-й пользовательский элемент управления.

Проблема в том, что пользовательский интерфейс 1-го пользовательского элемента управления зависает до завершения всего этого процесса. Вместо этого я хочу, чтобы пользовательский интерфейс первого пользователя не зависал. Причина в том, что пользовательскому интерфейсу 1-го элемента управления не нужно ждать обновления операции во 2-м пользовательском элементе управления. Обновление 2nd View может быть поставлено в очередь.

Итак, в основном я хочу, чтобы пользователь устанавливал / снимал флажки, просто отправлял уведомление (для обновления 2-го пользовательского элемента управления) и продолжал работать с моим пользовательским элементом управления, а не ждал.

Я пробовал фоновый рабочий, но, похоже, ничего не работает.

Любая помощь приветствуется.

  • Гиридж

1 Ответ

1 голос
/ 04 ноября 2011

Если вы в состоянии создать экземпляр ViewModel, который используется обоими представлениями, вы, вероятно, можете избежать необходимости выполнять какие-либо кодировки уведомлений.

Если вам нужно сохранить отдельную виртуальную машину, то, если у вас есть какой-то механизм событий в вашем коде, то добьетесь цели. Например, если вы используете Unity, EventAggregator может использоваться для уведомления, это будет обходить родительскую форму, и ваша вторая модель представления должна иметь возможность обновлять себя без необходимости быть в потоке GUI.

Быстрая, но маловероятная вещь, которую стоит попробовать (я говорю маловероятно, потому что я не смог получить от нее никаких преимуществ в производительности)

using (Dispatcher.CurrentDispatcher.DisableProcessing())
{
//notification code here
}

И, конечно, если ваш второй viewModel получает данные откуда-то, убедитесь, что они асинхронные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...