Призма, МВВМ и модульность
Я (очень) недавно начал изучать Prism (для приложения WPF) и работаю над небольшим демонстрационным приложением для своей команды. Мой вопрос довольно общий, но я не могу найти простой пример, чтобы направить меня:
Предполагая, что у меня есть оболочка (в основном модуле), а в оболочке есть область, которая должна быть заполнена содержимым из другого модуля (кстати, это хорошая идея?).
Как это происходит точно? Кто отвечает за добавление представления из другого модуля в указанный регион Shell? Когда инициализируется соответствующая модель представления другого модуля? Примеры кода / ссылки на них будут оценены.
Спасибо!
Изменить: Вопрос разделен, пожалуйста, смотрите новый вопрос.
2 ответа
Да, разделение оболочки и представлений - хорошая идея.
RegionManager отвечает за добавление представления в регионы. Поэтому вы регистрируете регион в RegionManager, а также регистрируете представление в RegionManager.
Внутри оболочки вы получите что-то вроде:
<Window xmlns:Regions="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism"
xmlns:Inf="clr-namespace:YourNamespace.Infrastructure;assembly=YourNamespaceInfrastructure">
<Grid>
<ContentControl
Regions:RegionManager.RegionName="{x:Static Inf:RegionNames.MainRegion}"/>
</Grid>
</Window>
Теперь вам нужно зарегистрировать вид на регион, в котором он будет находиться:
public class FirstModule : IModule
{
public void Initialize( )
{
RegionManager.RegisterViewWithRegion( RegionNames.MainRegion,
typeof( MainView ) );
RegionManager.RegisterViewWithRegion( RegionNames.SecondRegion,
( ) => Container.Resolve<ISomethingViewModel>( ).View );
}
}
Пример кода показывает оба типа регистрации. Первый предназначен для просмотра первых подходов, второй - для просмотра моделей первых подходов.
[РЕДАКТИРОВАТЬ]
Имена регионов определены в статическом классе в модуле инфраструктуры:
namespace YourNamespace.Infrastructure
{
public static class RegionNames
{
public const string MainRegion = "MainRegion";
//...
}
}
[/РЕДАКТИРОВАТЬ]
В вашем загрузчике вы определяете каталог модулей (переопределяя CreateModuleCatalog), в котором перечислены модули, которые будут использоваться в вашем приложении. Каждый модуль имеет класс, реализующий IModule, который содержит метод Initialize, который вызывается при создании модуля. В рамках этого вы бы определили, что нужно добавить в область на оболочке:
public void Initialize()
{
RegisterViewsAndServices(); //Method to register dependencies
IMyViewModel model = _container.Resolve<IMyViewModel>();
_regionManager.Regions[RegionNames.ShellHeaderRegion].Add(model);
}
Здесь я добавил view-модель в оболочку, и у меня есть словарь ресурсов, определенный снаружи, который определяет, какое представление должно быть применено к нему через DataTemplate.
Документация Prism (особенно глава 2) содержит много полезной информации об этом. http://msdn.microsoft.com/en-us/library/gg406140.aspx