Prism, Regions, Magic strings и рефакторинг: что-то здесь не хватает?

Чтобы создать составное представление приложения в моем приложении с разными регионами, до сих пор я всегда использовал презентатор содержимого и использовал DataBinding для установки его содержимого.

Если бы я хотел изменить его содержимое, мне просто нужно было бы использовать агрегатор событий, опубликовать ViewZoneChangedEvent, подписаться на него в окне «оболочки» и соответствующим образом обновить модель просмотра, чтобы новые данные быть доступным для привязки, и пользовательский интерфейс будет обновлен.

Я недавно наткнулся на эти регионы в Prism, на самом деле я видел их какое-то время, но я не чувствовал себя комфортно с ними, но, поскольку Prism - это своего рода «руководство по передовым методам», возможно, я что-то упускаю: позвольте мне объяснить почему я чувствую себя некомфортно.

при моем старом способе работы нет связи с XAML. вы никогда не упоминаете какую-либо конкретную магическую строку, которая должна присутствовать в XAML, и я думаю, что это важно, поскольку стиль может измениться.

Если бы хотя бы регионы выполняли проверку имен регионов во время компиляции (проверьте, действительно ли они существуют где-то), это потребовало бы использования допустимых имен регионов и было бы очень полезно при рефакторинге, но, насколько я знаю, такого нет. Некоторые люди используют перечисления и метод ToString перечисления, чтобы преобразовать его в строку и использовать в качестве имени региона, но опять же, насколько мне известно, нет реальной процедуры для проверки, действительно ли введенная строка действительна, и показать ошибка при компиляции, например, для Brushes.InValidColor.

Итак, мой вопрос заключается в следующем: что области призмы приносят в таблицу по сравнению с простой старой привязкой (плюс eventAggregator, если вы хотите общаться через ViewModels)?

и верны ли мои предположения о проверке названий регионов во время компиляции?


person Fabio Salvalai    schedule 27.07.2010    source источник


Ответы (3)


Использовать регионы намного чище, чем делать это «вручную». Используя регионы, вам не нужны какие-либо знания о том, как вам нужно добавлять новые представления в составной родительский элемент. Если вы делаете это «вручную», вам придется добавить некоторый код программной части в свое представление, что плохо.

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

public class RegionNames
{
    public static string MainRegion { get { return "MainRegion"; } }
}

а затем установите регион как ресурс таким образом (например, в App.xaml)

<Application.Resources>
    <ResourceDictionary>
        <infrastructure:RegionNames
            xmlns:infrastructure="clr-namespace:MyClass.Silverlight;assembly=MyModule.Silverlight"
            x:Key="RegionNames" />
    </ResourceDictionary>
</Application.Resources>

Затем я добавляю специфичные для модуля имена регионов в качестве констант на уровне модуля.

К сожалению, здесь нет проверки во время компиляции, но она намного лучше и чище, чем добавление имен регионов непосредственно в XAML, особенно если вы позже повторно используете имя в коде.

РЕДАКТИРОВАТЬ: я забыл включить XAML, чтобы показать, как вы используете эту константу. Сейчас это исправлено.

Где-нибудь в верхней части XAML включите ссылку на диспетчер региона:

xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"

А затем при настройке региона используйте имя региона, определенное как ресурс

 <ItemsControl Regions:RegionManager.RegionName="{Binding MainRegion, Source={StaticResource RegionNames}}" />
person R4cOOn    schedule 05.08.2010
comment
Кроме того, подумав и прочитав несколько статей здесь и там, я понял, что при правильном использовании регионы можно использовать для лучшего разделения и предотвращения создания экземпляров представлений с помощью ViewModels. см. об этом замечательную запись в блоге Марка! developmentalmadness.com/archive/2009/10/15/ - person Fabio Salvalai; 08.08.2010

Prism 7 по-прежнему использует магические строки для адресации регионов: |. Следующий подход показывает, как это изменить и выполнить проверку имен регионов во время компиляции.

Определите регионы в poco:

namespace YourApp
{
   public class Region
    {
        public const string Content = nameof(Content);
    }
}

Импортировать пространство имен в XAML

xmlns:vm="clr-namespace:YourApp"

Определите регион в XAML

<ContentControl MinHeight="300" MinWidth="500"
                prism:RegionManager.RegionName="{x:Static vm:Region.Content}" />

Получить регион на C #

var myRegion = regionManager.Regions[Region.Content];
person sa.he    schedule 20.12.2018

Насколько я понимаю, регионы позволяют запускать несколько модулей PRISM одновременно, если каждый из них работает в разных регионах. Пример: основная область может быть заполнена модулем ввода данных, в то время как область заголовка может быть заполнена областью обмена сообщениями / предупреждениями пользователя.

person Daniel Auger    schedule 27.07.2010
comment
Я согласен, но это то, что вы можете сделать с простым представителем контента и UserControl без какой-либо связи, если вы установите источник привязки ContentPresenter с помощью агрегатора событий, верно? - person Fabio Salvalai; 28.07.2010