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

#c# #wpf #events #routed-events

#c# #wpf #Мероприятия #перенаправленные события

Вопрос:

В моем приложении WPF есть модальный диалог, который позволяет пользователю входить на сервер. Диалоговое окно просто содержит пользовательский элемент управления, который обрабатывает все элементы входа (пользовательский интерфейс, вызов веб-службы и вызов маршрутизируемого события при возврате вызова).

Все работает хорошо, и я могу обработать свое событие в диалоговом окне (закройте диалоговое окно при успешном входе в систему). Однако я не могу обработать событие в своем основном приложении (я должен обновить пользовательский интерфейс после входа пользователя в систему).

Как можно перехватывать такие маршрутизируемые события за пределами окна, в котором оно было вызвано (если это вообще возможно)? Если это невозможно, каков обычный способ справиться с этим?

Ответ №1:

Перенаправленные события не передаются из новых окон владельцам. RoutedCommands также не будут работать напрямую. Но Binding s может работать!

При установке childWindow.OwnerWindow = Application.Current.MainWindow дочернее окно логически подключается к главному окну через его OwnerWindow свойство.

Вы могли бы использовать это для привязки к OwnerWindow команде ViewModel и ее выполнения.

   <Window x:Class="...ChildWindow"
          ... >
      <Button Command="{Binding Path=OwnerWindow.DataContext.SaveCommand,
                                RelativeSource={RelativeSource
                                    AncestorType={x:Type Window}}}"
              Content="Execute Owner's Save Command" />
  </Window>
  

Ответ №2:

Маршрутизируемые события не будут переходить из одного окна в другое.

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

Ответ №3:

Я не понимаю, как вы могли бы автоматически переносить маршрутизируемое событие между разными окнами, поскольку они не находятся в одном логическом дереве. Способ, которым сложные приложения пользовательского интерфейса, как правило, обрабатывают такого рода взаимодействие между представлениями, заключается в некоторой реализации EventAggregator шаблона, поэтому, если вы обнаружите, что вам нужно много общения между представлениями, это может быть гораздо более чистым способом справиться с такого рода сценариями. Платформа Prism содержит EventAggregator реализацию, но написанная вручную для простого сценария, не должна быть слишком сложной, если требуется.