画面に表示する情報の定義
コンポーネントを使う準備ができたならば、画面に表示したい情報や画面での操作に関する処理を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フォームが真っ白になったり、「応答待ち」表示になったりすることを防止できます。