MVVM-PRISM, как отобразить несколько экземпляров представления в регионе / ItemsControl - PullRequest
3 голосов
/ 19 октября 2010

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

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

Мне нужно отобразить несколько экземпляров OrdersDetailsView.xaml в пределах региона, размещенного в OrdersView.xaml. У меня есть OrderView 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 ОБА с ордерами ZZZ, я бы надеялся, что получил один просмотр с ордерами XXX и один с ордерами 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 Ответ

1 голос
/ 19 октября 2010

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

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

view.ApplyModel(viewmodel)

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

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

...