2010-10-19 56 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

相关问题