MVVM-PRISM,如何在区域/ItemsControl中显示多个视图实例

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) 

编辑:

为什么这段代码给了我两个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")

编辑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
1个回答

1

是的,这是正确的做法。当然,您需要重复此代码以创建新的 V-VM 对:

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

view.ApplyModel(viewmodel)

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

希望这可以帮到您。


Damian,谢谢,我正在慢慢地进步!请看一下我在上面的初始帖子中的编辑,看看你是否能够帮助我! - Mcad001
1
视图和虚拟机是如何注册的?使用GetHashCode方法来检查它们是否为同一实例。 - Damian Schenkelman
请参见上面的EDIT2,了解视图和VM的注册方式,我认为看起来是正确的。 - Mcad001
1
问题在于您正在使用ContainerControlledLifetimeManager(),它将VM注册为单例。因此,您有一个单一的VM被共享在两个不同的视图之间。移除LifetimeManager,您的代码将按预期开始工作。 - Damian Schenkelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接