Призма - условная навигация - PullRequest
0 голосов
/ 26 ноября 2009

Я использую Prism для навигации в своем Wpf-приложении. У меня есть несколько модулей, и каждый из них регистрирует себя в главном меню с помощью общих команд, отправляемых с использованием контейнера IoC в загрузчике. Пункты меню связаны с общими командами для навигации - что откроет правильный вид в некотором регионе. Все основано на рекомендациях, которые я нашел на сайте Prism.

Моя проблема сейчас в том, что у меня есть модуль, в котором есть условие, указывающее, хочу ли я открыть ViewA или ViewB в основной области. Пример: допустим, у меня есть модуль клиента - а затем пункт меню «Клиент», который откроет модуль клиента в главном окне. И есть условие: если у меня есть активный клиент, я хочу открыть CustomerDetailsView при нажатии на элемент меню, в противном случае я хочу открыть CustomersAdminView.

Какой рекомендуемый подход к решению этой проблемы? Я вижу несколько вариантов, но я думаю, что все они звучат немного странно. Сейчас я работаю над созданием того, что будет MasterCustomerView в примере выше. Это представление затем проверит условие и откроет UserControl, предоставив внутри детали Подробности администрирования. Я не все удовлетворены этим решением, хотя - это будет законный подход? Лучше?

1 Ответ

2 голосов
/ 26 ноября 2009

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

Это немного сложно, но я могу привести несколько примеров.

public interface IMenuRegistry
{
     void RegisterMenuItem(string title, 
                           Func<RelevantInformation, Object> executeFunction, 
                           Func<RelevantInformation, bool> canExecuteFunction);

     void RegisterMenuItem(string title, Type viewType);
}

Обратите внимание, у меня есть тип, который передается в «RelevantInformation», который может содержать текущего клиента и т. Д. Когда пользователь нажимает на элемент меню, я вызываю делегата и передаю всю информацию, которая может потребоваться его решение. Он возвращает объект View, который я могу затем поместить в любой подходящий регион.

Я также разрешаю модулю передавать делегат canExecute, аналогично тому, как работает команда (на самом деле, я беру все регистрации в меню и превращаю их в команды). Таким образом, модуль также может отключить себя, если какое-либо условие в RelevantInformation сделает пункт меню недействительным.

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

...