Caliburn.Micro возвращает результат из дочерней модели представления

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

Моя проблема: как я могу создать человека в дочерней модели представления и получить его в родительской. Я искал (много) и ничего удовлетворительного не нашел. Насколько мне известно, есть по крайней мере три возможности: 1. Используйте CMs EventAggregator для отправки сообщений родительскому (и всем остальным, кто его слушает) 2. Используйте свойство на дочерней виртуальной машине и получите доступ к нему после того, как WindowManger закроет диалог. 3. Реализуйте IResult.

Я уже сделал первый, но это (как уже говорилось) неудовлетворительно. Я не хочу, чтобы каждый получил результат только потому, что он слушает EventAggregator. Второй (на мой взгляд) не очень похож на MVVM (или нет?), Поскольку я не могу его контролировать, если он асинхронный. Насколько я могу судить из документа CM, третий вариант является предпочтительным. Однако я не нашел объяснения, как адаптировать его к моему решению. Мне нужно получить ввод пользователя, а это невозможно в методе Execute(CoroutineExecutionContext context).

Я что-то упускаю из виду или второй метод действительно лучший способ добиться этого?


person Ruhrpottpatriot    schedule 27.01.2015    source источник


Ответы (1)


2-й метод совершенно нормален.У меня есть ситуации, когда и мне нужен результат ответа, чтобы продолжить и получить его после закрытия представления, связанного с моделью представления, которую я вызываю в другом вызове метода, это можно сделать с помощью службы, специально предназначенной для захвата результаты, если вы ищете SOC, чтобы избежать конфликтов позже. На самом деле 1-й метод - это то, что я использую для нескольких вещей, за исключением того, что я напрямую контролирую, что может видеть сообщение (новый объект класса, за которым нужно следить), и единственные экраны, которые могут реагировать на сообщение, будут что-то делать. 3-й метод чрезвычайно эффективен, но На самом деле я никогда не использовал CoRoutines, это был ответ на async до того, как были доступны async / await. Есть много примеров IResult, плавающих вокруг

person mvermef    schedule 27.01.2015
comment
Сопрограммы, безусловно, являются чем-то вроде сиротского решения, потому что async / await более мощный. 2, вероятно, лучший подход. - person Nigel Sampson; 03.02.2015