gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:46:39 26 4
gpt4 key购买 nike

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

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

我需要在 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,但是实例化多个 View 和数据并将其加载到该区域的正确/首选方式是什么?

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 的 View 和一个带有订单 ZZZ 的 View ​​:

    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

最佳答案

是的,这是正确的做法。当然,您必须重复此代码才能创建新的 V-VM 对:

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

view.ApplyModel(viewmodel)

此外,无需调用 Activate,因为当宿主控件是 ItemsControl (AllActiveRegion) 时,所有 View 都处于事件状态。

我希望这会有所帮助。

关于MVVM-PRISM,如何在区域/ItemsControl中显示 View 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com