VB のたまご

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



ViewModelLocator2

  •  モジュールを学習したので、ちょっと戻って ViewModelLocator のカスタム設定をここでは学習します。 以前は自動インジェクション任せで ViewModel をバインドしていましたが、個別設定もすることができます。

  • スポンサーリンク


  •  以下では、同じアセンブリ内にあり、ViewModels フォルダ内で管理しているけど、 View 名に対応したクラス名ではない ViewModel クラスをインジェクションする方法です。

  •  それではサンプルを見てみましょう。 個別設定は、ブートストラッパー内で、ConfigureViewModelLocator メソッドに書いていきます。

  •  書き方その1
  • ' View の型、ViewModel の型
    ViewModelLocationProvider.Register(GetType(Window1).ToString(), GetType(CustomViewModel))
    

  •  書き方その2
  • ' View の型、ファクトリーメソッド(インスタンス生成したデータを登録)
    ViewModelLocationProvider.Register(GetType(Window1).ToString(), Function() Me.Container.Resolve(Of CustomViewModel)())
    

  •  書き方その3
  • ' ジェネリック形式の View の型、ファクトリーメソッド(インスタンス生成したデータを登録)
    ViewModelLocationProvider.Register(Of Window1)(Function() Me.Container.Resolve(Of CustomViewModel)())
    

  •  書き方その4
  • ' ジェネリック形式の View の型、ジェネリック形式の ViewModel の型
    ViewModelLocationProvider.Register(Of Window1, CustomViewModel)()
    

  •  いづれかの指定方法により、名前が不一致でもバインドすることができます。 このサンプルを実行すると、ViewModel の値が画面表示されます。

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

  •  CustomViewModel.vb

  • Namespace ViewModels
    
        Public Class CustomViewModel
    
            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">
    
        <Grid>
            <TextBlock Text="{Binding Title}" FontSize="40" />
        </Grid>
    
    </Window>
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports Prism.Mvvm
    Imports WpfApplication1.Views
    Imports WpfApplication1.ViewModels
    
    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
    
        ' ViewModelLocator の VM 探し(名前空間解決)方法をカスタマイズ
        Protected Overrides Sub ConfigureViewModelLocator()
            MyBase.ConfigureViewModelLocator()
    
            ' 同じアセンブリ内にあり ViewModels フォルダ内で管理しているが、View 名とは別の ViewModel を割り当てたい時
    
            '' Type, Type 形式の登録方法
            'ViewModelLocationProvider.Register(GetType(Window1).ToString(), GetType(CustomViewModel))
    
            '' Type, Factory(インスタンス生成したものを登録)形式の登録方法
            'ViewModelLocationProvider.Register(GetType(Window1).ToString(), Function() Me.Container.Resolve(Of CustomViewModel)())
    
            '' Generic Type, Factory(インスタンス生成したものを登録) 形式の登録方法
            'ViewModelLocationProvider.Register(Of Window1)(Function() Me.Container.Resolve(Of CustomViewModel)())
    
            ' Generic Type, Generic Type
            ViewModelLocationProvider.Register(Of Window1, CustomViewModel)()
    
    
        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