Призма, МВВМ и модульность

Я (очень) недавно начал изучать 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

Другие вопросы по тегам