サカスタClick Here! 掲示板お問い合わせランダムジャンプ

Top Index
Yahooは検索方式が変わったせいか、うまくサイト内検索できないなぁ。つーわけでグーグルに変更。


2009年06月13日
WPF スタートアップ画面にMVVMパターンを適用する
WPFアプリケーションを作成する際、通常はスタートアップURIはWindowクラスになります。
しかし、一番最初に起動するのがWindowクラスとなってしまっては、
画面(View)とビジネスロジック(ViewModel)を分離できません。

そこでスタートアップ画面からMVVMパターンを適用する手順を記載します。
1.VisualStudioを開き、WPFアプリケーションを起動


2.Application.xamlを開く。
中に、StartupUri="Window1.xaml"という記述があるので削除する。
削除後はこんな感じになる。

<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Application.Resources>

</Application.Resources>
</Application>

これで、スタートアップ画面が未設定となり、デバッグを実行してもなにも起動しなくなる。
このままではまずいので、手動で起動ロジックを記述していこう。


3.Application.xamlファイルを展開し、Application.xaml.vbをファイルを開く。
クラスの宣言文しかないので、ウインドウをインスタンスし、開く処理を記述する。
具体的にはこんな感じ。

Class Application

Private _view As Window

Private Sub Application_Startup(ByVal sender As Object, ByVal e As System.Windows.StartupEventArgs) Handles Me.Startup
_view = New Window1 '大元になるウインドウをインスタンス
_view.Show() 'ビューを開く
End Sub

End Class

これでデバッグを実行すれば、Window1の画面が開く。
しかし、ViewModelにあたるクラスがないため、このままでは実用性は皆無。
ViewModelにあたるクラス「SampleViewModel」を作ってみよう。


4.SampleViewModelクラスはViewModel(ビジネスロジック)を担当するクラスだが、作り方は通常のクラスと何ら代わりはない。
意味はあまりないが、とりあえず以下のようなコードでOK。

Public Class SampleViewModel

Public Sub New()
Me.Comment = "ViewModelです"
End Sub

Private _comment As String
Public Property Comment() As String
Get
Return _comment
End Get
Set(ByVal value As String)
_comment = value
End Set
End Property

End Class

スタートアップ画面からMVVMパターンを適用することを本題としており、MVVMがなんだとか、VMはどうとかいう話はとりあえず捨て置きます。
やっとこさViewModelができたので、Window1クラス(View)と紐付けしよう


5.ViewとViewModelとの紐付けはViewが起動する前にしか行えないので、組み込む場所はApplication.xaml.vbしかない。
Application.xaml.vbを開いて、以下のように編集する。

Class Application

Private _view As Window

Private Sub Application_Startup(ByVal sender As Object, ByVal e As System.Windows.StartupEventArgs) Handles Me.Startup
_view = New Window1 '大元になるウインドウをインスタンス
_view.DataContext = New SampleViewModel 'ViewModelをインスタンスし、Viewと関連付けする
_view.Show() 'ビューを開く
End Sub

End Class

_view.DataContext = New SampleViewModel って記述することで、ViewとViewModelを紐付けができます。
これでWindow1.xamlを展開して表示される、Window1.xaml.vbはいらない子になったので、削除しておこう。
とりあえずこれで完成。
しかし、デバッグしても物足らなすぎるので、ViewModelがちゃんと紐づいていることを確認しておわろう。


6.Window1.xamlを開き、以下のように編集する。Bindingという興味深いキーワードが出てきたが、
これは奥が深いのでとりあえずそのまま書いてくれると助かる。
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Binding Comment}" Height="300" Width="300">
<Grid>

</Grid>
</Window>

これで完璧だ。さっそく起動してみよう。
ウインドウのタイトルに”ViewModelです”と表示されていることが確認できる。
Window1.xamlに、SampleViewModel.vbに記述された内容が表示されているわけだ。
つまり、ちゃんと紐づいているってことだね。

今回はスタートアップにMVVMパターンを適用してみたわけですが、
MVVMを使いこなすには、Bindingというキーワードを使いこなさないといけないため、
次回以降でBindingについて触れてみたいと思います。

ソースコードのダウンロードはこちら
[ 投稿者:mk3008 at 00:22 | WPF | コメント(0) | トラックバック(0) ]

この記事へのコメント

この記事へのトラックバック

この記事へのトラックバックURL
http://shinshu.fm/MHz/88.44/a11462/0000285284.trackback

この記事の固定URL
http://shinshu.fm/MHz/88.44/archives/0000285284.html

記事へのコメント
 
認証コード:
画像に表示されるコードを半角英数字で入力して下さい。画像が読み難い場合はこちら
簡単演算認証: 3 + 4 =
足し算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント: