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
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); } }
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ファーストな開発」については終了にします。現在アルファ版でもう少しブラッシュアップしてベータ版にできた段階でより詳しい説明ができるようにします。それではまた。