(Photo by:Faris Algosaibi)
はじめに
Caliburn.Microは、オープンソースのMVVMライブラリです。WPFやSilverlight、Windows PhoneのアプリケーションにMVVMパターンを適用することができます。
軽量でXAMLのデータバインドとうまく連携しています。他にはMVVM Light Toolkitなどが有名ですが、Caliburn.Microの方が高機能です。この記事では、Caliburn.Microの、基本的な使い方を説明しています。まずは、MVVMパターンの簡単な説明からはじめます。
MVVMパターンとは?
MVVMパターンは、GUIアプリケーションに適用するアーキテクチャパターンの一種です。ソフトウェアを、Model(M)・View(V)・ViewModel(VM)の3つに分類して実装することで、保守性を高め、テストをしやすくします。MVVMパターンを、一から実装するのは大変なのでCaliburn.Microの力を借りましょう。
基本、依存関係(参照)はView→ViewModel→Modelが原則で逆方向の依存が無いようにします。ViewはXAMLで実装され、ViewModelが表示データや状態、イベントに対する処理を受け持ちます。Modelは、ビジネスロジック部分に相当するもので、ViewModelもしくはModelから使用されます。つまり、Viewは状態を持たない(ステートレス)です。
WinFormsでは、Viewに相当するFormがデータや状態を持っていて、ビジネスロジックが混在しがちなのでテストしにくいです。MVVMでは、Viewはデータや状態を持たないので、GUIをテストから切り離すことができます。テストは、Mockなどを使いViewModelとModelに対して行うことになります。
それでは、Hello,WorldでCaliburn.Microの簡単な使い方を説明します。
Caliburn.MicroのHello,World
1.WPFプロジェクトの新規作成
まずは、Visual Studioで、新規WPFアプリケーションを作成します。
2.MainWindow.xaml/.csの削除
今回は、MainWindow.xaml/.csは不要なので、削除しておきます。
3.NugetからCaliburn.Microをインストール
Nugetから「Caliburn.Micro.Startパッケージ」をインストールします。Caliburn.Micro.Startは、サンプルファイルが同梱されていますので簡単に始めることができます。サンプルファイルが不要な場合は、「Caliburn.Microパッケージ」をインストールしましょう。今回は、このサンプルファイルを使って説明していきます。
4.パッケージインストール時に追加されるファイル
パッケージをインストールすると、ライブラリの他に以下のファイルが追加されます。各ファイルの役割については後述します。
- AppBootstrapper.cs
- IShell.cs
- ShellView.xaml
- ShellViewModel.cs
5.App.xamlの編集
パッケージのインストールが終わったら、次は、App.xamlを編集します。ApplicationタグのStartupUri属性は不要なので削除します。その代わりに、アプリケーションの初期化処理を受け持つAppBootstrapperクラスをリソースに追加します。Bootstrapperは、起動時にインスタンス化され、初期化処理の後に最初のViewを表示します。
<Application x:Class="HelloCaliburn.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:HelloCaliburn"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <local:AppBootstrapper x:Key="bootstrapper" /> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
6.ここまでで一旦起動してみます
下記のようなウィンドウが表示されれば、ここまではOKです。
7.AppBootstrapper.csについて
パッケージインストール時に追加されたAppBootstrapper.csには、基本的なDIコンテナが実装されています。ここで、インターフェイスとクラスを関連付けることで、クラスのインスタンス化をDIコンテナに任せることができるので、直接クラスに依存することがなくなりテストしやすくなります。ここでは、同じく追加されたIShellインターフェイスとShellViewModelクラスを関連付けています。なお、サンプルファイルにはすでに記述されていますので、編集の必要はありません。
container.PerRequest();
スタートアップ処理もこのクラスから行われます。起動時に呼び出される、OnStartupメソッドをオーバーライドしてDisplayRootViewForメソッドで、はじめに起動するViewを指定します。このメソッドの型引数には、ViewModelクラスが実装しているインターフェイス型を指定します。実行時には、DIコンテナからShellViewModelクラスのインスタンスが取得され、規定の命名規約にそってShellView.xamlが取得され、ViewModelが設定された後に表示されます。
protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor(); }
8.IShell.csの編集
次に、ShellViewModelクラスに実装するIShellインターフェイスを修正します。ここでは、下記のようにプロパティとメソッドを宣言します。
public interface IShell { string Name { get; set; } bool CanSayHello { get; } void SayHello(); }
9.ShellViewModel.csの編集
次は、ShellViewModelクラスに先ほどのIShellインターフェイスを実装します。このクラスは、PropertyChangedBaseクラスを継承しています。これは、Caliburn.Microが提供するクラスで、View(XAML)にプロパティの変更を伝えるためのメソッドが実装されています。
Nameプロパティは、ViewのTextBoxとバインドするためのプロパティなので、セッターで関連するプロパティの変更通知をViewに対して送っています。
CanSayHelloプロパティは、後述するSayHelloメソッド(コマンド)が実行可能かどうかの状態を返します。コマンドと共にButtonなどのコントロールにバインドされると、プロパティの返り値によってコントロールの有効/無効状態が自動的に切り替わります。
SayHelloメソッドは、ButtonのコマンドとしてバインドされClickイベントによって呼びだされます。このコマンドの実行可能状態は、前述のCanSayHelloプロパティによって制御されています。ここでは、単純にダイアログを表示するだけです。
public class ShellViewModel : PropertyChangedBase, IShell { public string Name { get { return name; } set { name = value; NotifyOfPropertyChange(() => Name); NotifyOfPropertyChange(() => CanSayHello); } } private string name; public bool CanSayHello { get { return !string.IsNullOrWhiteSpace(Name); } } public void SayHello() { MessageBox.Show("Hello, " + Name); } }
ShellView.xamlの編集
最後に、ShellView.xamlに簡単な画面を構築して、先ほどのViewModelとバインドしましょう。ViewModelとの関連付けは、命名規約によって自動的に処理されるので、ここで明示的に記述する必要はありません。
TextBoxのTextプロパティに、ViewModelのNameプロパティをバインドしています。UpdateSourceTriggerをPropertyChangedにしないと、規定ではフォーカスを失った時にしかButtonの状態が更新されないので注意が必要です。
ButtonとViewModelのメソッドとのバインドは、Message.Attach添付プロパティにメソッド名を指定することで行います。CanSayHelloプロパティは、命名規約によって自動的にバインドされますので、ここでは指定不要です。
<Window x:Class="HelloCaliburn.ShellView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cm="http://www.caliburnproject.org" Title="Hello, Caliburn" SizeToContent="WidthAndHeight"> <StackPanel Margin="10"> <TextBox Width="250" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"> </TextBox> <Button Margin="0 10 0 0" Content="Say!" cm:Message.Attach="SayHello"> </StackPanel> </Window>
起動して動作確認する
ここまでで、実装は完了しましたので起動して動作確認してみましょう。テキストボックスに任意の文字を入力するとボタンが有効になり、ボタンをクリックすると入力した文字がダイアログに表示されます。うまくできましたか?
さいごに
以上、Caliburm.Microの基本的な使い方をお伝えしました。他にも、Window ManagerやEvent AggregatorなどMVVMパターン設計をサポートするクラスがありますので、くわしく知りたい方はドキュメント(英語)をご覧ください。しっかりとしたアーキテクチャで、保守性の高いアプリケーションを作っていきたいですね。
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
No Comments