2010-10-19 4 views
3

Je construis un module pour une application basée sur MVVM, CAL et PRISM. Je suis assez nouveau à ces concepts, et en essayant d'obtenir ma tête autour de tous les modèles et maintenant je suis aux prises avec le problème suivant:MVVM-PRISM, comment afficher plusieurs instances d'une vue dans une région/ItemsControl

Je suis dans le besoin de créer plusieurs instances de la même vue. Chacune des vues doit se lier à son propre ViewModel contenant des données pour cette vue spécifique. Un peu plus détaillé, voici mon scénario:

Je dois afficher plusieurs instances d'un OrdersDetailsView.xaml dans une région placée dans OrdersView.xaml. J'ai un XAML OrdersView qui contient une balise ItemsControl définie comme ceci:

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

Comme vous pouvez le comprendre - dans le ItemsControl dans mon OrdersView je veux afficher plusieurs instances d'un OrderDetailsView. Je suis en mesure d'ajouter un OrderDetailsView de la manière codée en dur décrite ci-dessous, mais quel est le moyen idéal pour instancier et charger plusieurs vues et données dans la région?

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) 

EDIT:

Pourquoi ce code me donne 2 OrdersDetailsView les deux avec des ordonnances ZZZ, je l'aurais espéré que je suis un point de vue avec des ordonnances XXX et une avec commandes 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") 

EDIT2:

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 

Répondre

1

Oui, c'est la bonne façon de le faire. Bien sûr, vous devrez répéter ce code à de nouvelles paires V-VM créées:

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

view.ApplyModel(viewmodel) 

En outre, il n'y a pas besoin d'appeler Activate, comme toutes les vues sont actives lorsque le contrôle hôte est un ItemsControl (AllActiveRegion) .

J'espère que cela aide.

+0

Damian, Thnx, j'arrive lentement là-bas! S'il vous plaît jeter un oeil à mon EDIT dans le post initial ci-dessus et voir si vous êtes en mesure de m'aider! – Mcad001

+1

Comment les vues et les machines virtuelles sont-elles enregistrées? Utilisez la méthode GetHashCode pour vérifier qu'ils ne sont pas la même instance. –

+0

S'il vous plaît voir EDIT2 ci-dessus pour la façon dont les vues et les machines virtuelles sont enregistrées, me semble correct .. – Mcad001

Questions connexes