4

我正在为基于 MVVM、CAL 和 PRISM 的应用程序构建一个模块。我对这些概念相当陌生,并试图了解所有模式,现在我正在努力解决以下问题:

我需要创建同一个视图的多个实例。每个视图都需要绑定到它自己的 ViewModel,其中包含该特定视图的数据。更详细一点,这是我的场景:

我需要在 OrdersView.xaml 中放置的区域内显示 OrdersDetailsView.xaml 的多个实例。我有一个 OrdersView XAML,其中包含一个 ItemsControl 标记,定义如下:

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

正如您所理解的 - 在我的 OrdersView 的 ItemsControl 中,我想显示 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 和 Orders ZZZ,我希望我得到一个带有 Orders XXX 的视图和一个带有 Orders 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")

编辑2:

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
4

1 回答 1

1

是的,这是正确的做法。当然,您将不得不重复此代码来创建新的 V-VM 对:

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

view.ApplyModel(viewmodel)

此外,不需要调用 Activate,因为当宿主控件是 ItemsControl (AllActiveRegion) 时,所有视图都是活动的。

我希望这有帮助。

于 2010-10-19T13:15:21.983 回答