VB のたまご

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



ViewModelLocator3

  •  続いては、同じアセンブリ内にあるけど任意の場所にある ViewModel をバインドする方法です。

  • スポンサーリンク


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

  • Dim method = Function(viewType As Type)
    
                     ' 同じ名前空間(アセンブリ)内、Views フォルダにある Window1+ViewModel というクラス
                     Dim viewName = viewType.FullName
                     Dim viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName
                     Dim viewModelName = $"{viewName}ViewModel, {viewAssemblyName}"
                     Return Type.GetType(viewModelName)
    
                 End Function
    
    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(method)
    

  •  ViewModelLocationProvider クラスの SetDefaultViewTypeToViewModelTypeResolver メソッド内で、 名前解決リゾルバメソッドを定義します。長いのでメソッドはラムダ式としてあらかじめ定義して分けました。

  •  このメソッドは、View の型を引数で受け取り、任意の名前空間に加工して、その型を返却します。 このサンプルでは、Views フォルダに ViewModel クラスがありますので、 View の名前空間と View クラス名に加えて、ViewModel をくっつけた名前空間が、ViewModel の型となります。

  •  このサンプルを実行すると、ViewModel の値が画面表示されます。

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

  •  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>
    

  •  Window1ViewModel.vb

  • Namespace Views
    
        Public Class Window1ViewModel
    
            Public Property Title As String = "Prism Unity Application"
    
        End Class
    
    End Namespace
    

  •  Bootstrapper.vb

  • Imports Microsoft.Practices.Unity
    Imports Prism.Unity
    Imports Prism.Mvvm
    Imports WpfApplication1.Views
    Imports System.Reflection
    
    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()
    
            Dim method = Function(viewType As Type)
    
                             ' 同じ名前空間(アセンブリ)内、Views フォルダにある Window1+ViewModel というクラス
                             Dim viewName = viewType.FullName
                             Dim viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName
                             Dim viewModelName = $"{viewName}ViewModel, {viewAssemblyName}"
                             Return Type.GetType(viewModelName)
    
                         End Function
    
            ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(method)
    
        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