Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVVM-PRISM,如何在区域/项目控件中显示视图的多个实例_Mvvm_Dependency Injection_Prism_Itemscontrol_Regions - Fatal编程技术网

MVVM-PRISM,如何在区域/项目控件中显示视图的多个实例

MVVM-PRISM,如何在区域/项目控件中显示视图的多个实例,mvvm,dependency-injection,prism,itemscontrol,regions,Mvvm,Dependency Injection,Prism,Itemscontrol,Regions,我正在为基于MVVM、CAL和PRISM的应用程序构建一个模块。我对这些概念相当陌生,试图了解所有的模式,现在我正努力解决以下问题: 我需要创建同一视图的多个实例。每个视图都需要绑定到自己的ViewModel,其中包含该特定视图的数据。更详细一点,这是我的场景: 我需要在OrdersView.xaml中放置的区域内显示OrdersDetailsView.xaml的多个实例。我有一个OrdersView XAML,其中包含一个ItemsControl标记,定义如下: <ItemsContro

我正在为基于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">
编辑:

为什么这段代码给了我2个OrdersDetailsView和OrdersZZZ,我希望我得到一个OrdersXXX视图和一个OrdersZZZ视图:

    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)时,所有视图都处于活动状态


我希望这能有所帮助。

达米安,我正在慢慢地到达那里!请看看我在上面的第一篇文章中的编辑,看看你是否能帮助我!视图和虚拟机是如何注册的。使用GetHashCode方法检查它们是否不是同一实例。请参阅上面的EDIT2,了解如何注册视图和VM,我认为这是正确的。问题是您使用的是ContainerControlled LifetimeManager(),它将VM注册为单例。因此,在两个不同的视图之间共享一个VM。删除LifetimeManager,您的代码将按预期开始工作。
Dim view = _Container.Resolve(Of OrdersDetailsView)()
Dim viewmodel = _Container.Resolve(Of OrdersDetailsViewModel)()

view.ApplyModel(viewmodel)