Управление Windows в WPF при использовании шаблона MVVM - PullRequest
0 голосов
/ 26 сентября 2011

Некоторое время назад я написал это ТАК сообщение в поисках хорошего способа управления взаимодействием пользовательского интерфейса и бизнес-уровня, и мне понравился ответ, который заключался в использовании шаблона MVVM.

Так что я сделал это довольно успешно, но я немного застрял с проблемой, используя этот шаблон. Действительно, в некоторой части моего пользовательского интерфейса одна из моих кнопок должна открывать диалог с деталями элемента, отображаемыми в ListView.

Я видел это ТАК сообщение , задающее тот же вопрос, но я не совсем понял ответ, и мне интересно, подходит ли он в моем случае. Идея заключалась в том, чтобы использовать инфраструктуру Unity и вызывать окно, связанное с представлением в хранилище, используя, например, App.Container.Resolve<MyChildView>().ShowDialog().

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

Второй вопрос, поскольку мой проект ViewModels на самом деле отсутствует в проекте клиента, и поэтому у меня нет доступа к глобальной переменной App. Поэтому я не думаю, что смогу использовать решение, которое нашел в предыдущем сообщении. Есть ли обходной путь?

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

1) Ваша реализация вовсе не ошибаетсяЯ регулярно разделяю пользовательский интерфейс, виртуальную машину и модели на отдельные сборки.

2) Как вы упомянули, неуместно ссылаться на приложение внутри виртуальной машины.Считайте приложение «классом пользовательского интерфейса» и относитесь к нему как таковому.Рассматривали ли вы внедрение соответствующего UnityContainer в вашу виртуальную машину?

Если внедрение контейнера не является для вас вариантом, подумайте о добавлении контроллера в свое решение или использовании шаблона Mediator, как это предусмотрено другими ответами в этом ТАК сообщение Вы упомянули.

0 голосов
/ 27 сентября 2011

Попробуй это.Настройте новый поток, инициализируйте и покажите свое окно (вы также можете использовать ShowDialog() вместо Show()), а затем преобразовать поток в поток пользовательского интерфейса, вызвав Dispatcher.Run(), который будет блокироваться до закрытия окна.Затем, после этого, вы можете обработать результат диалога так, как вам хочется.

new Thread(() =>
{
    MyDialogWindow m = new MyDialogWindow();
    m.ShowDialog();
    Dispatcher.Run();
    // Handle dialog result here.
}).Start();

Обязательно добавьте событие в диалоговом окне, чтобы при закрытии окна остановить Диспетчер.Добавьте это к вашему конструктору диалога:

Closed += (_,__) => Dispatcher.InvokeShutdown();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...