Призма, Регионы, Волшебные струны и рефакторинг: я что-то здесь упускаю? - PullRequest
2 голосов
/ 27 июля 2010

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

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

Теперь, я недавно натолкнулся на эти Регионы в Призме, на самом деле, я видел их некоторое время, но мне было неудобно с ними, но, поскольку Призма - это своего рода "руководство по наилучшим практикам", может быть, я что-то упускаю Позвольте мне объяснить, почему я чувствую себя некомфортно.

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

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

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

и верны ли мои предположения относительно проверки имен регионов во время компиляции?

Ответы [ 3 ]

4 голосов
/ 05 августа 2010

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

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

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}}" />
1 голос
/ 20 декабря 2018

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];
0 голосов
/ 27 июля 2010

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

...