漫坊亭

社会の底辺プログラマ

(自分用翻訳) Caliburn Micro Part 4: The Event Aggregator

原文へのリンク (google翻訳を使用しています)

Caliburn Micro Part 4: The Event Aggregator

このチュートリアル·シリーズに新しく追加された人のために、我々は、堅牢なMVVMアーキテクチャWPFアプリケーションを構築するためにCaliburnMicroを使用する方法について学習されています。CaliburnMicroはMVVM、MVPとMVCを含むいくつかの人気のUIパターンを使用して、.NETアプリケーション(WPFSilverlightとのWindows Phone7)を構築するために使用されるフレームワークです。それはあなたがそのようなバインディングを設定し、イベントをフックなどの一般的なタスクのために実行する必要があります作業の量を減らすためにきちんとした方法の多くを提供しています。CaliburnMicroの様々な特徴は、それが簡単にモデルオブジェクトとUIの間にきれいなラインを持つようになります。それはあなたのアプリケーションのテストと保守が容易であることを意味します。ここでは、以前のブログ記事へのリンクは次のとおりです。

Part 1: Getting Started Part 2: Data Binding and Events Part 3: More About Events and Parameters

今週のチュートリアルでは、CaliburnMicroに含まれているイベントのアグリゲータを使用する方法について学習します。イベントアグリゲータは、簡単にアプリケーションの複数の部分が相互にメッセージを送信することを可能にするサービスです。アプリケーションが通信する必要があるいくつかのビューのモデルで構成されている場合に便利です。これを行うには、イベントアグリゲータに(このようなビューモデルなど)のオブジェクトを購読し、彼らは耳を傾ける必要があるメッセージの種類を指定します。また、それはそのようなメッセージを受信したときにオブジェクトが何をするかを定義します。アプリケーションの別の部分がメッセージを発行しときに、イベント·アグリゲーターは、適切な購読のオブジェクトがそれを受信し、適切なアクションを実行確認します。このチュートリアルでは、私たちは入門チュートリアルで作られたアプリケーションを拡張します。

イベントアグリゲータは、複数のビューのモデルを持っている大規模なアプリケーションのために、より有用であるが、我々は、チュートリアルアプリケーションはかなり小さく維持されます。また、このチュートリアルでは、前のものに比べて消化するより多くを持っていることを警告されます!このチュートリアルの最後では、我々は独自のビューモデルを持つ2つのビューは、それぞれを表示するアプリケーションを持っています。ビューの一つは、それぞれが異なる色を表す、いくつかのラジオボタンが表示されます。ラジオボタンがクリックされると、我々は適切な色を含むメッセージを公開します。 2番目のビューは、これらのメッセージをリスンし、長方形の色を変更します。 、IHandleインタフェースを実装し、アプリケーションに別のビューを追加するイベントアグリゲータにビューモデルのいずれかを購読し、最終的に他のビューモデルからのイベントを公開:私たちは4つのステップでこれを行います。

Step 1: Adding Another View and View-Model

イベントアグリゲータを実証するために、我々は我々のアプリケーションには、少なくとも2のビューモデルが必要になります。我々はまだ別のものを追加することから始めます、1(AppViewModel)があります。入門チュートリアルで説明命名規則を覚えていますか? ColorViewModelと呼ばれる新しいクラス、およびColorViewと呼ばれるユーザーコントロールを追加します。我々は少なくとも我々が最初のアプリケーションに追加したときに表示するために何かを持っているようにもColorViewの背景を変更することができます。ビジュアル構造の面では、我々は新しいColorViewを含むように既存のAppViewを得ようとしています。 (ビューがイベントアグリゲータを使用するためにネストすることはする必要はありません。。ビューモデルは、アプリケーションのどこからでも公開されているメッセージを聞くことができます)これを行うには、AppViewModelは我々が設定されますタイプColorViewModelのプロパティが必要になりますこのようなコンストラクタ

public class AppViewModel : PropertyChangedBase
{
  public AppViewModel(ColorViewModel colorModel)
  {
    ColorModel = colorModel;
  }
 
  public ColorViewModel ColorModel { get; private set; }
}

AppView.xamlでは、2列にグリッドを分割し、最初の列にColorModelViewが表示されます。 AppView.xamlは現在、次のようになります。

<Grid Width="300" Height="300" Background="LightBlue">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <ContentControl Name="ColorModel" Margin="10" />
</Grid>

ここで発生する何が起こっているのか?私たちはただAppViewModelに追加プロパティと同じ名前であることがContentControlの名前を設定しています。このことから、CaliburnMicroは親切に私達のためColorModelプロパティにContentControlのContentプロパティをバインドします。我々は、後でこれを実行すると、CaliburnMicroはColorViewのインスタンスがColorViewModelのために表示されていることを確認します。

私たちは今、アプリケーションを実行した場合、我々はAppViewModelのデフォルトコンストラクタが見つからないという例外に遭遇すると思います。うーん、それは良い点だ:私たちは、パラメータが必要ですAppViewModelのコンストラクタ含まれている - ColorViewModelオブジェクトを。以下に見られるようにこの問題を解決するために、我々は我々のAppBootstrapperを更新する必要があります。 (アプリケーションにSystem.ComponentModel.Composition.dllへの参照を含めるようにしてください。)

using Caliburn.Micro;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
 
public class AppBootstrapper : Bootstrapper<AppViewModel>
{
  private CompositionContainer container;
 
  protected override void Configure()
  {
    container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
 
    CompositionBatch batch = new CompositionBatch();
 
    batch.AddExportedValue<IWindowManager>(new WindowManager());
    batch.AddExportedValue<IEventAggregator>(new EventAggregator());
    batch.AddExportedValue(container);
 
    container.Compose(batch);
  }
 
  protected override object GetInstance(Type serviceType, string key)
  {
    string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
    var exports = container.GetExportedValues<object>(contract);
 
    if (exports.Count() > 0)
    {
      return exports.First();
    }
 
    throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
  }
}

これはCaliburnMicroダウンロードに付属のサンプルで使用bootstrappersに似ています。ように私は(あなたがより多くの詳細が必要な場合は、MEFまたはManaged Extensibility Frameworkを検索)このコードが何をしているかの詳細内容に飛び込むことはありません、このブログの記事が長く作るためではありません。

次に、我々は両方の我々の見解·モデル·クラスのエクスポート属性を含める必要があります。これは動作するAppBootstrapperでGetInstanceメソッドのためのものです。

[Export(typeof(AppViewModel))]
public class AppViewModel : PropertyChangedBase
{
  ...
}
 
[Export(typeof(ColorViewModel))]
public class ColorViewModel
{
}

そして最後に、AppViewModelのコンストラクタImportingConstructor属性が含まれています。これにはデフォルトコンストラクタがないため、このコンストラクタを使用する必要があることを示すためです。CaliburnMicroがAppViewModelを作成すると、それはまた、私たちのためにコンストラクターに渡すColorViewModelのインスタンスを作成します。

[ImportingConstructor]
public AppViewModel(ColorViewModel colorModel)
{
  ColorModel = colorModel;
}

今、私たちは、アプリケーションを実行しColorViewが正常AppView内に表示されていることがわかります。

f:id:jfactory:20150621213630p:plain

の2番目の列に矩形を追加してみましょう。これは、メッセージがこのようなAppViewModelのプロパティによって処理されるので、その色が制御されたときに色が変化する矩形になります。

private SolidColorBrush _Color;
 
public SolidColorBrush Color
{
  get { return _Color; }
  set
  {
    _Color = value;
    NotifyOfPropertyChange(() => Color);
  }
}

-

<Rectangle Grid.Column="1" Width="100" Height="100" Fill="{Binding Color}" />

Step 2: Implementing the IHandle Interface

我々はAppViewModelによってピックアップするColorViewModelからのメッセージを公開しようとしています。我々は、メッセージ情報を保持するクラスを実装する必要があるとしているこれを行うにしてください。そのようなクラスは、通常は非常に小さく、簡単です。これは主に、我々が送信するすべての情報を保持するいくつかのプロパティを持っている必要があります。ここでは、使用しようとしているメッセージクラスは次のとおりです。

public class ColorEvent
{
  public ColorEvent(SolidColorBrush color)
  {
    Color = color;
  }
 
  public SolidColorBrush Color { get; private set; }
}

適切なイベントを処理するAppViewModelためには、それはIHandleインタフェースを実装する必要があります。我々のケースでは、ジェネリック型としてColorEventを使用することになります。 IHandleインターフェイスは、我々はハンドルと呼ばれる実装する必要があり、単一のメソッドがあります。私たちのAppViewModelのハンドル方法では、我々はColorEventで送信されたSolidColorBrushのを見て、Colorプロパティを設定するためにそれを使用します。これは、順番にビューに四角形の色を変更します。

public void Handle(ColorEvent message)
{
  Color = message.Color;
}

Step 3: Subscribe

今、私たちはそれが実際に公開されたメッセージの監視ことができるように、イベントアグリゲータにAppViewModelを購読する必要があります。我々はIEventAggregatorなりコンストラクタに別のパラメータを追加することによってこれを行います。時間がAppViewModelを作成するとなると、CaliburnMicroは、我々はブートストラップで設定したイベントアグリゲータに渡します。さて、コンストラクタ内で、我々は、単にこのようなメソッドを購読呼び出します。

[ImportingConstructor]
public AppViewModel(ColorViewModel colorModel, IEventAggregator events)
{
  ColorModel = colorModel;
 
  events.Subscribe(this);
}

Step 4: Publish

ColorViewModelはまた、メッセージをパブリッシュできるように、イベントアグリゲータを必要としています。 IEventAggregatorを取り、フィールドに格納するColorViewModelにコンストラクタを追加します。 ImportingConstructor属性を含めることを忘れないでください:

private readonly IEventAggregator _events;
 
[ImportingConstructor]
public ColorViewModel(IEventAggregator events)
{
  _events = events;
}

今、私たちはちょうど彼らのclickイベントに耳を傾け、ColorViewにラジオボタンを追加し、メッセージをパブリッシュする必要があります。あなたは、クリックイベントをリッスンする簡単な方法については、このシリーズの第2回のチュートリアルから覚えていることがあります。単に私たちが望む方法が呼ばれるようにと同じになるようにラジオボタンの名前を設定します。私たちは、コースの利用イベントパラメータではなく、すべてのRadioButtonのアクションメソッドを持つこともできますが、私はあなたが明らかに起こっているのかを見ることができますこのようにそれを行っています:

<RadioButton Name="Red" Content="Red" Foreground="White"
             VerticalAlignment="Center" HorizontalAlignment="Center" />
<RadioButton Name="Green" Content="Green" Foreground="White"
             VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="1" />
<RadioButton Name="Blue" Content="Blue" Foreground="White"
             VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="2" />

-

public void Red()
{
  _events.Publish(new ColorEvent(new SolidColorBrush(Colors.Red)));
}
 
public void Green()
{
  _events.Publish(new ColorEvent(new SolidColorBrush(Colors.Green)));
}
 
public void Blue()
{
  _events.Publish(new ColorEvent(new SolidColorBrush(Colors.Blue)));
}

そして、それはこれだけです。これで、アプリケーションを実行し、ラジオボタンをクリックします。 AppViewModelが正常に四角形の色を変更するColorViewModelからmessgaesを取得していることを参照してください。

f:id:jfactory:20150621214626p:plain

もう一つ注意すべきは、私が矩形の色を設定するメッセージでSolidColorBrushes周りに渡してきたということです。一般的にはあなたがたSolidColorBrushなどの値を解釈するためにUIのコンバータを使用後、周りより基本的値を渡すとなります。

このチュートリアルの完全なのVisual Studio2010のプロジェクトは、ここからダウンロード可能です。私はあなたのアプリケーションでさまざまなビュー·モデル間の通信を編成するために有用なイベントアグリゲータを見つけることを願っています。多型イベントサブスクリプション、カスタム出版マーシャリングを行い、イベントアグリゲータから登録解除する方法など詳細については、ドキュメントを参照してチェックしてください。

あなたの次の時間を参照してください。