2010-10-19 3 views
3

Я создаю модуль для приложения, основанного на MVVM, CAL и PRISM. Я довольно новичок в этих концепциях и пытаюсь разобраться во всех шаблонах, и сейчас я борюсь со следующей проблемой:MVVM-PRISM, как отображать несколько экземпляров представления в регионе/ItemsControl

Мне нужно создать несколько экземпляров одного и того же представления. Каждому из видов необходимо привязать его собственный ViewModel, содержащий данные для этого конкретного вида. Немного более подробно, это мой сценарий:

Мне нужно отобразить несколько экземпляров OrdersDetailsView.xaml в регионе, расположенном в OrdersView.xaml. У меня есть OrdersView XAML, который содержит тег ItemsControl, определенный как это:

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

Как вы можете понять - внутри ItemsControl в моем OrdersView я хочу, чтобы отобразить несколько экземпляров 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) 

EDIT:

Почему этот код дает мне 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") 

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 

ответ

1

Да это правильный способ сделать это. Конечно, вам придется повторить этот код для создаваемых новых пар V-VM:

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

view.ApplyModel(viewmodel) 

Кроме того, нет необходимости вызывать Activate, так как все виды активны, когда управление хозяином является ItemsControl (AllActiveRegion) ,

Надеюсь, это поможет.

+0

Дамиан, Тинкс, я медленно туда добираюсь! Пожалуйста, взгляните на мой EDIT в главном сообщении выше и посмотрите, сможете ли вы мне помочь! – Mcad001

+1

Как регистрируются виды и виртуальные машины. Используйте метод GetHashCode для проверки того, что они не являются одним и тем же экземпляром. –

+0

Пожалуйста, см. EDIT2 выше для того, как регистрируются просмотры и виртуальные машины. Кажется правильным для меня. – Mcad001