В системах меню, которые я построил на основе 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 сделает пункт меню недействительным.
На самом деле это только один из многих способов решения этой проблемы, но это близко к тому, что я делаю. Надеюсь, вы найдете его полезным или заставите задуматься об альтернативных способах решения проблемы.