我是MVVM和Prism的新手,请设法绕过它。我用Google搜索了很多代码示例,现在我尝试将它们组合在一起。但是我不知道这是否像我那样正确?
基本上,我有3个级别的TreeView。对于3个TreeView级别的每一个,我都有一个View / Viewmodel。因此,如果TreeView级别具有更多项,我将注入同一View / Viewmodel的第二个实例。因此,TreeViewItem 2.1具有与2.2相同的View / Viewmodel,但是它们具有不同的数据/ ID。这就是我到目前为止所得到的。在MainWindowViewModel中(我有一个Unity容器和一个RegionManager):
Public Overrides Sub Initialize()
Container.RegisterTypeForNavigation(Of Views.TreeLevel1View)()
Container.RegisterTypeForNavigation(Of Views.TreeLevel2View)()
Container.RegisterTypeForNavigation(Of Views.TreeLevel3View)()
End Sub
单击TreeViewItem后,我有一个DelegateCommand到此Sub(在TreeViewModel中):
Public Sub TreeViewClickEvent(ByVal treeviewobject as Object)
Dim parameter = New NavigationParameters()
If treeviewobject.Level = 1 Then
parameter.Add("Level1", treeviewobject.ID)
RegionManager.RequestNavigate("TreeViewDetailRegion", "TreeLevel1View", parameter)
Elseif treeviewobject.Level = 2 Then
parameter.Add("Level2", treeviewobject.ID)
RegionManager.RequestNavigate("TreeViewDetailRegion", "TreeLevel2View", parameter)
Else
parameter.Add("Level3", treeviewobject.ID)
RegionManager.RequestNavigate("TreeViewDetailRegion", "TreeLevel3View", parameter)
End if
End Sub
然后,我在ViewModel中为level1检查ID是否与TreeViewItem相同(例如,LevelID是一个属性):
Public Sub OnNavigatedTo(navigationContext As NavigationContext) Implements INavigationAware.OnNavigatedTo
Dim navigationID As String = navigationContext.Parameters("Level1")
If navigationID IsNot Nothing Then
LevelID = navigationID
End If
End Sub
Public Function IsNavigationTarget(navigationContext As NavigationContext) As Boolean Implements INavigationAware.IsNavigationTarget
Dim navigationID As String = navigationContext.Parameters("Level1")
If navigationID IsNot Nothing Then
Return LevelID IsNot Nothing AndAlso navigationID = LevelID
Else
Return True
End If
End Function
所以基本上我是在属性LevelID的帮助下导航的,这感觉不太好:-(
我也尝试了这种向该区域添加视图的方法,但是我不知道我需要多少,并且不确定将其放置在何处。
Public Sub TreeViewClickEvent(ByVal treeviewobject As Object)
Dim Level1View1 As Views.TreeLevel1View = Container.Resolve(Of Views.TreeLevel1View)
Dim Level1View2 As Views.TreeLevel1View = Container.Resolve(Of Views.TreeLevel1View)
Dim TreeViewItemRegionTest = Me.RegionManager.Regions(RegionNames.TreeItemDetailRegion)
--- TreeViewItem 2.1
TreeViewItemRegionTest.Add(Level1View1, treeviewobject.ID)
--- TreeViewItem 2.2
TreeViewItemRegionTest.Add(Level1View2, treeviewobject.ID)
End Sub