画面に表示する情報の定義
コンポーネントを使う準備ができたならば、画面に表示したい情報や画面での操作に関する処理をMainViewModelクラスに記述します。
MainViewModelクラスに記述するコードは実際にはもう少し必要ですが、重要な部分だけを抜き出すと次のようになります。
Imports System.Collections.ObjectModel
Imports System.Runtime.CompilerServices
Imports System.ComponentModel
Public Class MainViewModel
Implements INotifyPropertyChanged
Private WithEvents Model As New MailModel
Public Property Items As ObservableCollection(Of MailModel.TMail)
Get
Return Me.Model.Items
End Get
Set(value As ObservableCollection(Of MailModel.TMail))
Me.Model.Items = value
End Set
End Property
Public Async Function GetMail() As Task
Await Me.Model.GetMail()
End Function
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _
Implements INotifyPropertyChanged.PropertyChanged
End Class
受信メール一覧はItemsプロパティに設定され、一覧を作るためのメソッドがGetMailメソッドとして定義されています。この時点では、まだMailModelクラスの中身は記述していないため、例えば「Me.Model.GetMail()」などと入力するとIDEの即時チェックでコンパイルエラーです。しかし、エラー修正のオプションで「MailModelにGetMailのメソッドスタブを生成」を選択すると、MailModelクラスにPublicメソッドの入り口だけ定義され、コンパイルエラーが解消できます。
画面の定義
今回のサンプルでは、非常にシンプルな画面構成を採用しています。
[一覧受信]をクリックしたら、受信メールの一覧をボタン下のListBoxに表示します。
画面のコードビハインド定義
画面定義が終わったら、次に画面定義に紐づいたコードを記述します。
ソリューションエクスプローラーで「MainForm.vb」を右クリックして[コード]メニューを選択すると、MainFormと関連づいたコード(コードビハインド)を記述するためのコードエディタが開きます。
Public Class MainForm
Private WithEvents ViewModel As New MainViewModel
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles Me.Load
Me.ListBox1.DrawMode = DrawMode.OwnerDrawVariable
End Sub
Private Async Sub Get_Button_Click(sender As Object, e As EventArgs) _
Handles Get_Button.Click
Await Me.ViewModel.GetMail()
Me.ListBox1.DataSource = Me.ViewModel.Items.ToList
End Sub
:
(中略)
:
End Class
Get_Button_Clickイベントプロシージャでは、MainViewModelクラスのGetMailメソッドを非同期待ち合わせで呼び出しています。この非同期待ち合わせ(Await)は、Visual Studio 2012(.NET Framework 4.5)から採用されたもので、UIスレッドへ制御を戻しつつ、GetMailメソッドの実行が完了するまで待ち合わせる動きが可能になります。つまり、Windowsフォームアプリでありがちな、長時間処理実行中にWindowsフォームが真っ白になったり、「応答待ち」表示になったりすることを防止できます。

