【问题标题】:MVVM-PRISM, how to display multiple instances of a view in a region/ItemsControlMVVM-PRISM,如何在区域/ItemsControl 中显示视图的多个实例
【发布时间】:2011-04-27 09:17:48
【问题描述】:

我正在为基于 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

【问题讨论】:

    标签: mvvm dependency-injection prism itemscontrol regions


    【解决方案1】:

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 达米安,Thnx,我正在慢慢到达那里!请在上面的初始帖子中查看我的编辑,看看您是否能够帮助我!
    • 如何注册视图和虚拟机。使用 GetHashCode 方法检查它们是否不是同一个实例。
    • 请参阅上面的 EDIT2 了解如何注册视图和虚拟机,这对我来说似乎是正确的..
    • 问题是您使用的是ContainerControlledLifetimeManager(),它将VM注册为单例。因此,您有一个在两个不同视图之间共享的 VM。删除 LifetimeManager,您的代码将按预期开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-07-29
    相关资源
    最近更新 更多