2010-10-19 53 views
3

我正在爲基於MVVM,CAL和PRISM的應用程序構建模塊。我對這些概念還比較陌生,並且試圖讓我的腦袋圍繞所有模式,現在我正在努力解決以下問題:MVVM-PRISM,如何顯示區域中的多個視圖實例/ ItemsControl

我需要創建同一視圖的多個實例。每個視圖都需要綁定到它自己的包含該特定視圖的數據的ViewModel。更詳細一點,這是我的場景:

我需要在放置在OrdersView.xaml中的區域內顯示OrdersDetailsView.xaml的多個實例。我有一個包含這樣定義一個ItemsControl標籤的OrdersView XAML:

<ItemsControl x:Name="OrdersItemsControl" BorderThickness="0" 
cal:RegionManager.RegionName="OrdersRegion" Margin="0,10,0,10"> 

正如你能理解 - ItemsControl的內我OrdersView我想顯示OrderDetailsView的多個實例。我可以在下面描述的硬編碼方式中添加一個 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) 

編輯:

爲什麼這個代碼給我2 OrdersDetailsView都與訂單ZZZ,我本來希望我有一個觀點與訂單XXX和一個與訂單ZZZ:

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 

回答

1

是的,這是做的正確的方式。當然,你將不得不重複這個代碼來創建新的V-VM對:

Dim view = _Container.Resolve(Of OrdersDetailsView)() 
Dim viewmodel = _Container.Resolve(Of OrdersDetailsViewModel)() 

view.ApplyModel(viewmodel) 

而且,沒有必要調用激活,因爲所有的意見都是積極的,當主機控制是一個ItemsControl(AllActiveRegion) 。

我希望這會有所幫助。

+0

達米安,Thnx,我正慢慢到達那裏!請看看我的編輯在上面的初始文章,看看你是否能夠幫助我! – Mcad001 2010-10-19 14:05:12

+1

如何註冊視圖和虛擬機。使用GetHashCode方法檢查它們不是相同的實例。 – 2010-10-19 14:10:25

+0

請參閱上面的EDIT2以瞭解視圖和虛擬機如何被註冊,對我來說似乎是正確的。 – Mcad001 2010-10-19 14:40:24

相關問題