Призма, МВВМ и модульность - PullRequest
1 голос
/ 23 ноября 2011

Я (очень) недавно начал изучать Prism (для приложения WPF), и я работал над небольшим демонстрационным приложением для своей команды.Мой вопрос довольно общий, но я не могу найти простой пример для направления:
Предполагая, что у меня есть Shell (в основном модуле), и у Shell есть область, которая должна быть заполнена содержимым издругой модуль (кстати, это хорошая идея?).
Как это происходит в точности?Кто отвечает за добавление представления из другого модуля в указанный регион Shell?Когда инициализируется соответствующая модель представления другого модуля?Примеры кода / ссылки на них приветствуются.

Спасибо!

Редактировать : Разделение вопроса, см. новый вопрос .

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

В вашем загрузчике вы определяете каталог модулей (переопределяя CreateModuleCatalog), в котором перечислены модули, которые будут использоваться в вашем приложении.Каждый модуль имеет класс, реализующий IModule, который содержит метод Initialize, который вызывается при создании модуля.В рамках этого вы бы определили, что нужно добавить в область на оболочке:

    public void Initialize()
    {
        RegisterViewsAndServices(); //Method to register dependencies
        IMyViewModel model = _container.Resolve<IMyViewModel>();
        _regionManager.Regions[RegionNames.ShellHeaderRegion].Add(model);
    }

Здесь я добавил модель оболочки в оболочку, и у меня есть словарь ресурсов, определенный снаружи, который определяет, какое представление следует применятьк нему через DataTemplate.

Документация Prism (особенно глава 2) содержит много полезной информации об этом.http://msdn.microsoft.com/en-us/library/gg406140.aspx

1 голос
/ 23 ноября 2011

Да, разделение оболочки и представлений - хорошая идея.

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 );
    }
}

В примере кода показаны оба типа регистраций.Первый предназначен для первых подходов к представлению, последний - для первых подходов для модели представления.

[EDIT]

Имена областей определены в статическом классе вмодуль инфраструктуры:

namespace YourNamespace.Infrastructure
{
    public static class RegionNames
    {
        public const string MainRegion = "MainRegion";
        //...
    }
}

[/ EDIT]

...