VB のたまご

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



ViewModelLocator

  •  ここでは、ViewModelLocator(ビューモデルロケーター、自動的に View に ViewModel をインジェクション) について学習します。

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


  •  通常、View に ViewModel をバインドするには、View の DataContext タグに ViewModel を直接指定します。 手動でバインド設定をしなければならないこの作業を、自動でバインド( View へのインジェクション)してくれるのが、ViewModelLocator です。

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

  • 設定する View
    
    <Window x:Class="Views.Window1"xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            ~>
        
        <Grid>
            <TextBlock Text="{Binding Title}" />
        </Grid>
        
    </Window>
    

    バインドする ViewModel
    
    Namespace ViewModels ' ←名前空間を追加する
    
        Public Class Window1ViewModel
    
            Public Property Title As String = "Prism Unity Application"
    
        End Class
    
    End Namespace
    

  •  名前空間に Prism を追加して、ViewModelLocator クラスの AutoWireViewModel プロパティを True にセットします。 このサンプルを実行すると、View に ViewModel で設定しているタイトルが表示されます。

  •  イメージ図で先に説明していますが、該当するViewModel 探しは、名前解決ルールに従って探し出してインジェクションしています。 .Views. を .ViewModels. に、XxxView を XxxViewModel に置換した後の名前空間クラスが存在する場合、 このクラスを 該当の ViewModel と判断してインジェクションします。 もし見つからなかった場合は、何もしない。です。エラーにはなりません。

  • スポンサーリンク


  •  以下、ソース全体です。

  •  Window1ViewModel.vb

  • Namespace ViewModels ' ←名前空間を追加する
    
        Public Class Window1ViewModel
    
            Public Property Title As String = "Prism Unity Application"
    
        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="{Binding Title}" Height="350" Width="525">
        
        <!--
        ・名前空間の追加
        xmlns:prism="http://prismlibrary.com/"
        
        ・View に 対応する ViewModel を自動的にインジェクションするための命令
        prism:ViewModelLocator.AutoWireViewModel="True"
        
        この命令があると、Prism では、
         1.XxxProject.Views.XxxView なら、
              XxxProject.ViewModels.XxxViewModel を、
         2.XxxProject.Views.Xxx なら、
              XxxProject.ViewModels.XxxViewModel を、
        探しに行って、View の DataContext プロパティに ViewModel のインスタンスをセットします。
        
        -->
        
        
        <Grid>
            <TextBlock Text="{Binding Title}" />
        </Grid>
        
    </Window>
    

  •  Window1.xaml.vb

  • Namespace Views ' ←名前空間を追加する
    
        Public Class Window1
    
        End Class
    
    End Namespace
    

  •  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

  • <Application x:Class="Application"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1">
        
        <!--
        【StartupUri="MainWindow.xaml"】を削除
        コードビハインドで、OnStartup メソッドをオーバーライド
        -->
        
        <Application.Resources>
            
        </Application.Resources>
    </Application>
    

  •  Application.xaml.vb

  • 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