Пример по переходу проекта на PRISM:

- Требуется выводить информацию в заголовок
- Наполнение страницы произвольное, однако следует использовать все наработки из WPF MVVM приложения
- Должна быть навигация между различными страницами приложения

Наполнение страницы произвольное, однако следует использовать данные для отображения и редактирования настроек приложения.
## Этап 1. Создание проектов

## Этап 2. Настройка оболочки
Класс `App` наследуется от класса `PrismApplication`.
Также ниже приведен пример подключения ресурсов из других библиотек:
```xml
```
Класс `App` настраиваем зависимости и регистрируем модули.
В общей библиотеке заносим справочник регионов.
```cs
public partial class App
{
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
// Тут регистрируем модули
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Тут регистрируем зависимости
}
protected override Window CreateShell()
=> Container.Resolve<ВашаОболочка>();
}
```
В оболочке размечаем регионы, используя `ContentControl`-ы.
```xml
```
## Этап 3. Настройка модуля
Переносим вторую лабораторную работу в отдельный модуль: проект настраиваемых элементов управления.
Добавляем класс для регистрации модуля:
```cs
public class YourModule : IModule
{
public void RegisterTypes(IContainerRegistry containerRegistry)
{
// Регистрация зависимостей
containerRegistry
.Register()
.RegisterSingleton()
.Register<Класс>() // не имеет смысла
.RegisterSingleton<Класс>();
// Для навигации
containerRegistry
.RegisterForNavigation<имя_представления>();
}
public void OnInitialized(IContainerProvider containerProvider)
{
//Если надо сразу же привязать представление к региону
containerProvider.Resolve()
.RegisterViewWithRegion(“Название региона”, “Название представления”);
}
}
```
## Этап 4. Навигация
Основные классы для навигации.
Внедряем менеджер регионов, используем его для навигации.
```cs
private readonly IRegionManager _regionManager;
private void Navigate()
{
_regionManager
.RequestNavigate(“Имя региона”, “Имя представления”);
}
```
## Этап 5. Обмен между модулями
Основные классы для отправки сообщений:
```cs
public class Какое_то_имя : PubSubEvent<Какой_то_тип> {}
IEventAggregator eventAggregator
```
Функцию `WhenPropertyChanged` из библиотеки MVVM:
```cs
Какая_то_модель.WhenPropertyChanged(x => x.Какое_то_свойство, eventAggregator.GetEvent<Какое_то_имя>().Publish);
// Информирование об изменении какого то свойства, используя агрегатор событий и возможности Reactive UI
var someObs = Model.WhenAnyValue(x => x.Какое_то_свойство);
someObs.Subscribe(eventAggregator.GetEvent<Какое_то_имя>().Publish);
```
Основные классы для приема сообщений:
```cs
public class Какое_то_имя : PubSubEvent<Какой_то_тип> {}
IEventAggregator eventAggregator
eventAggregator
.GetEvent<Какое_то_имя>()
.Subscribe(Какое_то_действие);
```
## Использование Reactive UI + Fody
```cs
// Реактивные модели
internal class Какая_то_Model : ReactiveObject
{
[Reactive] public int Value { get; set; }
}
// Reactive UI Commands
var counterObs = Model.WhenAnyValue(x => x.Value);
IncrementCommand = ReactiveCommand.CreateFromTask(Increment, counterObs.Select(CanIncrement));
DecrementCommand = ReactiveCommand.Create(Decrement, counterObs.Select(CanDecrement));
// MVVM
DecrementCommand = new RelayCommand(Decrement, CanDecrement);
Model.WhenPropertyChanged(x => x.Value, DecrementCommand.RaiseCanExecuteChanged);
```