かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

PrismのMVVM関連のクラスを使ってHello world

Prismの最新バージョンからMVVMでの開発をサポートしてくれるようになりました。という話を聞いてPrismをダウンロードしてきてレッツトライ!としようと思うと、Bootstrapperがどうの、EventAggregaterがどうの、Regionがどうの、MEFがどうのUnityがどうのetc...と色々覚えないといけないおまけがついてくる割に、MVVM何処にあるんだ??という状態になってしまいます。

Prismは、使いこなすと便利なのですが、そういう便利クラスは置いておいて、MVVMの基本クラスだけ拝借するのでしたら、以下で述べてるクラス群をチョイスして使うだけでOKです。

ということでPrismを使ってMVVMをしようとする人がPrismの樹海に迷い込まないようにPrismのクラスを使ってMVVMアプリケーションのHello worldを作ってみようと思います。

とりあえず必要最低限のHello world

ということで、Hello worldを作ってみようと思います。画面にボタンがあって、ボタンを押すとHello worldと文字が表示されるものにしようと思います。
PrismHelloWorldという名前で、WPFアプリケーションを作成します。作成したアプリケーションに以下のPrismのアセンブリの参照を追加します。

  • Microsoft.Practices.Prism
  • Microsoft.Practices.Interactivity
  • Microsoft.Practices.ServiceLocation
ViewModelの基本クラスの作成

一応自前で作っておきますが、中身は空の実装です。

namespace PrismHelloWorld.ViewModel
{
    using Microsoft.Practices.Prism.ViewModel;

    public class ViewModelBase : NotificationObject
    {
    }
}

何かViewModelに共通の基本的な実装がほしくなったらここに追加しましょう。例としては、プロパティの妥当性検証とかのしくみをここに実装してもいいかもしれません。

Modelの作成

ハローワールドにモデルって要るの?という感じですが、今回は一応MVVMということなのでModel作っておきます。

namespace PrismHelloWorld.Model
{
    public class HelloWorldModel
    {
        public string GetMessage()
        {
            return "Hello world";
        }
    }
}
ViewModelの作成

次にMainWindow用のViewModelクラスを作成します。ボタンに対応するコマンドクラスと、コマンドのExecuteメソッドでModelを使ってメッセージを取得しています。そして取得したメッセージをプロパティに格納しています。

namespace PrismHelloWorld.ViewModel
{
    using Microsoft.Practices.Prism.Commands;
    using PrismHelloWorld.Model;

    public class MainWindowViewModel : ViewModelBase
    {
        // モデルクラス
        private HelloWorldModel model = new HelloWorldModel();

        // ボタンに紐づけるコマンド
        private DelegateCommand helloWorldCommand;

        public DelegateCommand HelloWorldCommand
        {
            get
            {
                return this.helloWorldCommand = this.helloWorldCommand ??
                    new DelegateCommand(HelloWorldExecute);
            }
        }

        // コマンドから実行されるメソッド
        private void HelloWorldExecute()
        {
            // モデルの処理の結果をVMのプロパティに格納
            this.Message = model.GetMessage();
        }

        // 画面に表示するメッセージ
        private string message;

        public string Message
        {
            get
            {
                return this.message;
            }

            set
            {
                this.message = value;
                base.RaisePropertyChanged(() => Message);
            }
        }
    }
}
Viewの作成

最後にViewを作ってみます。Viewはボタンとテキストブロックがあるだけのシンプルなものにしました。

<Window x:Class="PrismHelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:PrismHelloWorld.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:MainWindowViewModel />
    </Window.DataContext>
    <StackPanel Name="stackPanel1">
        <Button Content="Button" Name="button1" Command="{Binding Path=HelloWorldCommand}" />
        <TextBlock Height="23" Name="textBlock1" Text="{Binding Path=Message}" />
    </StackPanel>
</Window>
動かしてみよう

実装が完了したので動かしてみましょう。実行すると、以下のようにボタンがあるだけの画面が表示されます。

そして、ボタンを押すと画面にHello worldと表示されます。

以上でPrismを使ったMVVMのハローワールドは完成です。プロジェクトは以下からダウンロードできます。