ViewModelファーストな開発(その4)

前回まではWPF版でしたが、今回はSilverlight版での開発を説明します。ViewMakerの機能は、WPF版とSilverlight版は同じ機能を持っていますのでほぼ同じような開発になります。
Silverlight版でLOBアプリはWCFベースのドメインサービスを利用した方式で説明します。

1.Silverlightビジネスアプリケーションを作成

新しいプロジェクトを作成し、いくつかのアセンブリを参照します。

参照アセンブリ
・SilverlightViewMaker.Core
・System.ComponentModel.Composition
・System.Windows.Controls.Data
・System.Windows.Controls.Input
・System.Windows.Controls.Input.Toolkit
・System.Windows.Controls.Toolkit

2.Entity Frameworkを利用したModel作成

WPFの場合と同じようにEntity Frameworkを利用してMVVMのModel部に相当するエンティティを作成します。

3.Entity Frameworkを利用したModel作成

Silverlightからエンティティを利用するためにドメインサービスを作成します。ウイザードに沿ってauthorsテーブルを取得するドメインサービスを定義します。

定義できたら一旦ビルドします。これでSilverlightからエンティティを操作できる準備が整います。

4.ViewModelの作成

Silverlight版でもWPF版と同様にListViewModelを定義します。ほぼ同じような定義になっています。ShowDetailCommandが若干違いますが、Silverlight版のRelayCommandがWPFよりも若干機能ダウンするためです。もう少しコードを記述すると1つのコードにできますがここでは割愛します。

    public class ListViewModel<T> : ViewModel where T : Entity
    {
        [View(ViewControlType.DataGrid)]
        [ViewProperty(DataGridViewControl.Properties.SelectedItem, "SelectedData")]
        public List<T> Data { get; set; }

        public T SelectedData {get; set;}

        public ListViewModel(List<T> data)
        {
            Data = data;
        }

        public ICommand ShowDetailCommand
        {
            get 
            {
                return CreateCommand(() => { 
                    if (SelectedData != null) ViewUtil.ShowDialog(SelectedData);
                });
            }
        }
    }
5.MainPageの再作成

プロジェクトの既定のMainPageを一旦削除して新しいMainPageを作成します。作成したMainPageのコードビハンドに以下のようにドメインサービスを呼び出してViewUtil.BuildContentを使ってViewのコンテンツを作成するコードを記述します。コードの見通しが若干悪いのですがこれはドメインサービスの処理が非同期で行われるためです。

    public partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();

            var ctx = new AuthorsDomainContext();
            var query = ctx.GetAuthorsQuery();
            ctx.Load<authors>(query, (x) => 
                {
                    var vm = new ListViewModel<authors>(ctx.authors.ToList());
                    this.Content = (UIElement)ViewUtil.BuildContent(vm);
                }, null);
        }
    }
6.自動生成されたViewの確認

ここまでで実行できる状態になるので、実行して画面を一旦確認してみます。


7.Viewのレイアウト編集

表示した画面で右クリックして「Edit Layout」を選択すると編集用のパネルが表示されるので、各アイテムを編集します。なお、右クリックを行った場合にSilverlight(S)と出るようであれば、タイトル用の文字の上で行ってください。


8.Viewレイアウトの保存

作成したレイアウトを保存する場合は編集用のパネル上部のLayoutを選択してSaveすることでXMLの情報を保存できます。保存先は分離ストレージになります。

まとめ

Silverlight版でもWPF版と同じようにViewModelをベースとしてViewを構築することができます。またViewModelのコードもほぼ同じで、再利用可能なことを示唆しています。実際ViewMakerのWPF版とSilverlight版でViewModelについてはほぼコード共有化しているのでViewModelの再利用性の高さは実証できていると考えています。あと、SilverlightのComboBoxは編集できないなどの制限がありますが、AutoCompleteBoxなどで代用できる仕組みを含めるなどできるだけ共通的になるように機能を提供しています。

今回で一旦この「ViewModelファーストな開発」については終了にします。現在アルファ版でもう少しブラッシュアップしてベータ版にできた段階でより詳しい説明ができるようにします。それではまた。