MVVM、CAL、PRISMに基づくアプリケーション用のモジュールを構築しています。私はこれらの概念にかなり慣れていないので、すべてのパターンに頭を悩ませようとしていますが、現在、次の問題に苦しんでいます。
同じビューの複数のインスタンスを作成する必要があります。各ビューは、その特定のビューのデータを含む独自のViewModelにバインドする必要があります。もう少し詳しく、これが私のシナリオです。
OrdersView.xamlに配置されたリージョン内にOrdersDetailsView.xamlの複数のインスタンスを表示する必要があります。次のように定義されたItemsControlタグを含むOrdersViewXAMLがあります。
<ItemsControl x:Name="OrdersItemsControl" BorderThickness="0"
cal:RegionManager.RegionName="OrdersRegion" Margin="0,10,0,10">
ご存知のとおり、OrdersViewのItemsControl内に、OrderDetailsViewの複数のインスタンスを表示したいと思います。以下に説明するハードコードされた方法で1つのOrderDetailsViewを追加できますが、複数のビューとデータをインスタンス化してリージョンにロードするための正しい/推奨される方法は何ですか?
Dim OrdersRegion = _RegionManager.Regions("OrdersRegion")
Dim view = _Container.Resolve(Of OrdersDetailsView)()
Dim viewmodel = _Container.Resolve(Of OrdersDetailsViewModel)()
view.ApplyModel(viewmodel)
OrdersRegion.Add(view, "OrdersDetailsView")
OrdersRegion.Activate(view)
編集:
このコードで、OrdersZZZで2つのOrdersDetailsViewが得られるのはなぜですか。OrdersXXXで1つのビュー、OrdersZZZで1つのビューが表示されることを期待していました。
Dim OrdersRegion = _RegionManager.Regions("OrdersRegion")
Dim viewX = _Container.Resolve(Of OrdersDetailsView)()
Dim viewmodelX = _Container.Resolve(Of OrdersDetailsViewModel)()
viewmodelX.OrdersName = "Orders XXX"
viewX.ApplyModel(viewmodelX)
Dim viewZ = _Container.Resolve(Of OrdersDetailsView)()
Dim viewmodelZ = _Container.Resolve(Of OrdersDetailsViewModel)()
viewmodelZ.OrdersName = "Orders ZZZ"
viewZ.ApplyModel(viewmodelZ)
OrdersRegion.Add(viewX, "OrdersDetailsViewX")
OrdersRegion.Add(viewZ, "OrdersDetailsViewZ")
EDIT2:
Public Sub Initialize() Implements Microsoft.Practices.Composite.Modularity.IModule.Initialize
RegisterServices()
container.Resolve(Of IOrdersView)()
container.Resolve(Of IOrdersViewModel)()
container.Resolve(Of IOrdersDetailsView)()
container.Resolve(Of IOrdersDetailsViewModel)()
End Sub
Private Sub RegisterServices()
container.RegisterType(Of IOrdersViewModel, OrdersViewModel)(New ContainerControlledLifetimeManager())
container.RegisterType(Of IOrdersView, OrdersView)()
container.RegisterType(Of IOrdersDetailsViewModel, OrdersDetailsViewModel)(New ContainerControlledLifetimeManager())
container.RegisterType(Of IOrdersDetailsView, OrdersDetailsView)()
End Sub