SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(Secure iNetSuite)

Secure iNetSuite for .NET 4.0Jを最新環境で使ってみる

Windows 8.1+Visual Studio 2013+Secure Mail for.NET 4.0Jの組み合わせを確認

  • X ポスト
  • このエントリーをはてなブックマークに追加

画面のコードビハインド定義

 画面定義がおわったら、次に画面定義に紐づいたコードを記述します。

 ソリューションエクスプローラーで「MainWindow.xaml.vb」をダブルクリックすると、MainWindow.xamlと関連づいたコード(コードビハインド)を記述するためのコードエディタが開きます。

リスト6 MainWindow.xaml.vbのコード
Class MainWindow
    Private ViewModel As New MainViewModel

    Public Sub New()
        InitializeComponent()
        Me.DataContext = Me.ViewModel
    End Sub
End Class

 WPFアプリでは、XAML側でボタンクリックしたときに呼び出すViewModelのプロパティを指定できるので、コードビハインドに記載が必要なコードはほとんどありません。

MainViewModelへの変更

 Windowsフォームアプリを作成したときのMainViewModelクラスでは、ボタンクリック時にMainWindow.vbから呼び出されていたのはGetMailメソッドでした。XAMLからはICommandインターフェースを持ったプロパティにコマンドバインディングされて呼び出されるので、MainViewModelのGetMailメソッド部分を次のように書き換えます。

リスト7 MainViewModelクラスの書き換え部分
        :
      (中略)
        :
    Public Async Function GetMail() As Task
        Await Me.Model.GetMail()
    End Sub
        :
      (中略)
        :
リスト8 MainViewModelクラスの書き換え後
        :
      (中略)
        :
    Private _GetMailCommand As Common.RelayCommand
    Public Property GetMailCommand() As Common.RelayCommand
        Get
            If _GetMailCommand Is Nothing Then
                _GetMailCommand = New Common.RelayCommand(AddressOf Me.GetMail)
            End If
            Return _GetMailCommand
        End Get
        Set(value As Common.RelayCommand)
            _GetMailCommand = value
        End Set
    End Property

    Private Async Sub GetMail()
        Await Me.Model.GetMail()
    End Sub
        :
      (中略)
        :

 記述量は少し増えてしまうのですが、こうすることでXAML側とViewModelの関係はますます疎にできます。なお、Common.RelayCommandクラスはサンプルコードのCommonフォルダの中に新規作成していますので、詳しい内容はサンプルコードをダウンロードして確認してください。

実行結果の確認

 それでは、実行結果を確認してみましょう。

図7 実行結果の確認
図7 実行結果の確認

 残念ながらMailModelクラスの中で実行時エラーとなってしまいました。原因は、Windowsフォームのときと異なり、MailModelクラスのItemsはMainViewModelを介してMainWindowのListBoxにBindingされている点です。つまり、非同期実行しているmes.Get(0)実行時に発生するProgressイベントの処理の中でMe.Items.Addすると、それはUIスレッドでXAMLが更新することになり、非同期スレッドからUIスレッドというスレッド間の連携が生じてしまうからです。

 そのため、PopProgressイベントプロシージャの中を次のように書き換えることで解決ができます。

リスト9 PopProgressイベントプロシージャの書き換え後
        :
      (中略)
        :
    Private Context As SynchronizationContext = SynchronizationContext.Current
        :
      (中略)
        :
    Private Sub PopProgress(sender As Object, e As Dart.Mail.PopProgressEventArgs)
        If e.Final Then
            Me.Context.Post(Sub(o)
                                Me.Items.Add(New TMail With {
                                                 .From = e.Message.Message.From,
                                                 .Subject = e.Message.Message.Subject,
                                                 .SendDate = e.Message.Message.Date
                                             })
                            End Sub,
                Nothing)
        End If
    End Sub
        :
      (中略)
        :

 それでは再度、実行結果を確認してみましょう。

図8 実行結果の確認
図8 実行結果の確認

 今度は正常に表示できました。もちろん文字化けすることもまったくなく、一覧が作成されています。

次のページ
Windowsストアアプリへの適用例

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7460 2016/03/14 11:42

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング