VB のたまご

作成日: 2017/05/14, 更新日: 2017/05/14



BindableBase

  •  ここからは、MVVM パターン実装となる、変更通知プロパティ、コマンド、メッセンジャー周りを学習します。

  • イメージ
    スポンサーリンク


  •  ここでは、変更通知プロパティを学習します。 今までバインドしてきた ViewModel は、値が変更された時に通知する機能が無いため、初期値は表示できても変更後の値は表示(更新)できません。 これを可能にする機能を持つのが変更通知プロパティです。

  •  変更通知プロパティは、Prism.Mvvm.BindableBase クラスを継承して作成します。 プロパティ定義時に、セッター処理内で SetProperty メソッドを通してセットすることで変更を通知することができるようになります。

  •  それではサンプルを見てみましょう。

  • Imports Prism.Mvvm
    
    Namespace ViewModels
    
        Public Class Window1ViewModel
            Inherits BindableBase
    
            Private _HelloText As String = "Hello"
            Public Property HelloText() As String
                Get
                    Return _HelloText
                End Get
                Set(ByVal value As String)
                    Me.SetProperty(_HelloText, value)
                End Set
            End Property
    
            ' コンストラクタ
            Public Sub New()
    
                Me.HelloText = Me.HelloText & ", Prism!"
    
            End Sub
    
        End Class
    
    End Namespace
    

  •  このサンプルを実行すると、コンストラクタ内でセットした値が表示されます。

  •  それでは、以下ソース全体です。
  •  今回は、WPF アプリケーションプロジェクトのみです。

  •  Window1ViewModel.vb

  • Imports Prism.Mvvm
    
    Namespace ViewModels
    
        Public Class Window1ViewModel
            Inherits BindableBase
    
            ' 変更通知プロパティにより、値が変更されたら表示更新依頼を View に通知できる
            ' 変更通知プロパティを作る場合は、BindableBase クラスを継承する
            ' プロパティのセッター処理で、SetProperty メソッドを使うように変更する
    
            ' コードスニペットを利用して変更通知プロパティを書く
            ' property と入力して、タブキー2回押す
            ' 挿入後、タブキーを押すごとに、フィールド名、型、プロパティ名と遷移していくので、
            ' 適切な名前と型に変更する
            ' .NET 標準のプロパティ用だが多少楽できる、セッター処理の SetProperty メソッドを忘れない事
    
            Private _HelloText As String = "Hello"
            Public Property HelloText() As String
                Get
                    Return _HelloText
                End Get
                Set(ByVal value As String)
                    Me.SetProperty(_HelloText, value)
                End Set
            End Property
    
            ' コンストラクタ
            Public Sub New()
    
                Me.HelloText = Me.HelloText & ", Prism!"
    
            End Sub
    
        End Class
    
    End Namespace
    

  •  Window1.xaml
  •  画面クラスのコードビハインドには、名前空間の追加以外、処理はありません。

  • <Window x:Class="Views.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1.Views"
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            mc:Ignorable="d"
            Title="Window1" Height="350" Width="525">
    
        <StackPanel>
    
            <TextBlock Text="{Binding HelloText}" />
    
        </StackPanel>
        
    </Window>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports WpfApplication1.Views
    
    Public Class Bootstrapper
        Inherits UnityBootstrapper
    
        ' Shell 担当になる View のインスタンスを返却
        Protected Overrides Function CreateShell() As DependencyObject
            Return Me.Container.Resolve(Of Window1)
        End Function
    
        ' Shell 担当になる View を表示
        Protected Overrides Sub InitializeShell()
            Application.Current.MainWindow.Show()
        End Sub
    
    End Class
    

  •  Application.xaml.vb
  •  ※Application.xaml では、【StartupUri="MainWindow.xaml"】を削除しています。

  • Class Application
    
        ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
        ' このファイルで処理できます。
    
        Protected Overrides Sub OnStartup(e As StartupEventArgs)
            MyBase.OnStartup(e)
    
            ' Unity 管理による Prism アプリケーションの起動制御処理を実行
            Dim boot = New Bootstrapper
            boot.Run()
    
        End Sub
    
    End Class