読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

SImple MVVM Toolkitのサンプルを見てみる

C# WPF

おとといくらいにTwitterで回ってきてちょっと気になってたSimpleMVVM Toolkitをちょろっと見てみました。

個人的には・・・うーん。あんまりシンプルじゃないというのが今んとこの正直な感覚かも。まぁまだWPFのプロジェクトテンプレートみただけなのでなんとも言えませんが。

ともあれ、テンプレート

とりあえず、サンプルテンプレートの構造を見てみましょう。ざくっとしたクラス図を書くとこんな感じです。
f:id:posaunehm:20120118232746p:image

結構特徴的かな、と思うのは

  • Locatorを使っている
    • MEF使ってオンデマンドにViewModelを読み込むのもサポート(そういうスニペットがある)
        // Create MyViewModel on demand
        [ImportMany]
        public Lazy<IMyServiceAgent, IServiceAgentMetadata>[] MyServiceAgents { get; set; }
        public MyViewModel MyViewModel
        {
            get
            {
                var serviceAgent = MyServiceAgents
                    .Where(sa => sa.Metadata.AgentType == agentType).FirstOrDefault();
                MyViewModel viewModel = null;
                if (serviceAgent != null) viewModel = new MyViewModel(serviceAgent.Value);
                else if (DesignerProperties.IsInDesignTool) viewModel = new MyViewModel();
                return viewModel;
            }
        }
  • ModelクラスがViewModelクラスの基底プロパティとして定義されてる(ないパターンも作れるけど)
    • その場合は、ModelのNotificationがViewに飛ぶ、というかModelをそのままバインドする(えー
        <TextBox Grid.Row="0" Grid.Column="1" Height="30"
                 Text="{Binding Path=Model.CustomerId}" />
public void BeginEdit()
    {
        // Throw an exception if Entity not supplied
        if (Model == null)
        {
            throw new InvalidOperationException("Entity must be set");
        }

        // Copy entity
        Original = Model;
        Copy = Model.Clone();

        // Point entity to the copy
        Model = Copy;
    }

    public void CancelEdit()
    {
        // Point entity to original
        Model = Original;
    }

    public void EndEdit()
    {
        // Tranfer values from copy to original
        Copy.CopyValuesTo(Original);

        // Point entity to original
        Model = Original;
    }

あとは、なぜかデフォルトのサンプルはMethodのバインディング使っていたりします。個人的には僕これ嫌い。

        <Button Content="New Customer" Grid.Row="3" Grid.ColumnSpan="2" 
                Height="30" Width="100">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ei:CallMethodAction 
                            TargetObject="{Binding}"
                            MethodName="NewCustomer"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

で、どうなの

個々の機能は面白いの多いですよ。[Begin|End|Cancel]Editとか。でも基底でやることかぁ?というのはあったり。MEF前提の拡張店とかも楽しげだとは思います。

んが。

じゃあこれじゃないと、という魅力は僕には今ひとつ無いです。それぞれどっかで見た機能だし、目新しさはないですね。MVVM LightとPrismの妾の子、といった雰囲気でしょうか。
あとはView側のサポートが貧弱。MVVM Simpleはサンプルでも普通にコードビハインドでイベント受け取るのを推奨してるし。

The view can respond handle the event in its code-behind class, supplying the argument, which in this case is a boolean indicating that the user confirmed the order.

というわけで、View周りの実装に一番エレガントさを感じるLivetが独自性あって楽しげです。浮気はせずにLivetのRCを待ち望む感じですね、個人的には。

というか記事が止まってるので、これを機に再開します。終わった頃にRC出て大幅改訂で涙目になっても泣かない覚悟はできてる。