2

アプリケーションでさまざまなリージョンの複合アプリケーションビューを構築するために、これまでは常にコンテンツプレゼンターを使用し、DataBindingを使用してコンテンツを設定してきました。

コンテンツを変更したい場合は、イベントアグリゲーターを使用し、ViewZoneChangedEventを公開し、「シェル」ウィンドウでサブスクライブし、それに応じてビューモデルを更新して、新しいデータがバインディングとUIが更新されます。

さて、最近、Prismでそれらの地域に出くわしました。実際、しばらく見ていましたが、快適ではありませんでしたが、Prismはある種の「ベストプラクティスガイダンス」であるため、何かが足りない可能性があります。説明させてください。なぜ私は不快に感じるのですか。

私の古いやり方では、XAMLとの結合はありません。XAMLに存在する必要のある特定のマジックストリングについて言及することは決してありません。スタイルは変更される可能性があるため、これは不可欠だと思います。

少なくともリージョンがリージョン名のコンパイル時チェックを実行する場合(実際にどこかに存在することをチェック)、有効なリージョン名の使用を強制し、リファクタリング時に非常に役立ちますが、私が知る限り、そのようなことはありません。列挙型とToString列挙型のメソッドを使用して文字列に変換し、領域名として使用する人もいますが、私が知る限り、入力された文字列が本当に有効であるかどうかを確認してエラーを表示する実際のルーチンはありませんたとえば、Brushes.InValidColorに対して行われる方法をコンパイルする場合。

だから、私の質問は次のとおりです:プレーンな古いバインディング(およびViewModels間で通信したい場合はeventAggregator)と比較して、プリズム領域はテーブルに何をもたらしますか?

リージョン名のコンパイル時の検証についての私の仮定は正しいですか?

4

3 に答える 3

5

「手作業」で行うよりも、リージョンを使用する方がはるかにクリーンです。リージョンを使用すると、複合親に新しいビューを追加する方法についての知識は必要ありません。「手作業で」行う場合は、ビューにコードビハインドを追加する必要がありますが、これは悪いことです。

マジックストリングを回避する方法は、すべての領域名を定数として定義することです。

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}}" />
于 2010-08-05T10:04:29.040 に答える
4

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];
于 2018-12-20T07:54:04.260 に答える
0

リージョンについての私の理解は、リージョンがそれぞれ異なるリージョンで実行されている場合、複数のPRISMモジュールを同時に実行できることです。例:メイン領域はデータ入力モジュールで満たされ、ヘッダー領域はユーザーメッセージング/アラート領域で満たされる場合があります。

于 2010-07-27T14:54:27.727 に答える