在我当前的项目中,我使用的是 MVVMLight 框架。
我在视图之间导航时遇到了一些困难。目前,我正在使用 DataTemplates 在视图之间导航。但是,每次导航到另一个视图时,都会重新创建该视图。另外,我正在使用嵌套视图。总之,我觉得我需要一个更高级的框架来管理基于视图的导航。
我正在考虑使用 Prism 基于视图的导航。我想用 Prism RegionManager 定义区域;将我的观点登记到区域;并随后执行导航请求。
如何将 Prism RegionManager 与 MVVMLight 框架集成?
最终,我希望能够做到以下几点:
public class NavigationViewModel : ViewModelBase
{
private readonly IRegionManager _regionManager;
// Constructor
public NavigationViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
}
...
// Navigate
private void ExecuteNavigationCommand(string ViewName)
{
_regionManager.RequestNavigate(RegionNames.ContentRegion, ViewName);
}
}
关于如何实现这一目标的任何想法?
编辑:
我创建了一个实现以下接口的 NavigationService:
public interface INavigationService
{
RelayCommand<string> NavigateCommand { get; }
List<String> History { get; }
Dictionary<String, UserControl> Views { get; }
void AddView(UserControl view, RegionName region);
void RemoveView(UserControl view);
void ResetView(UserControl view);
UserControl GetView(Type viewType);
void NavigateRequest(Type viewType);
}
此 NavigationService 通过 MVVMLight 的 SimpleIoC 注入到我的 ShellViewModel。在 ShellViewModel 我注册我的导航视图如下:
// Add navigatable view instances and corresponding region
_navigationService.AddView(new HomeView(), RegionName.MainRegion);
_navigationService.AddView(new QuickscanView(), RegionName.MainRegion);
_navigationService.AddView(new PartsView(), RegionName.MainRegion);
_navigationService.AddView(new NavigationView(), RegionName.NavigationRegion);
_navigationService.AddView(new StatusbarView(), RegionName.StatusRegion);
随后,我可以将视图设置为我的预定义区域,如下所示:
// Set Navigation and Statusbar
this.NavigationRegion = _navigationService.GetView(typeof(NavigationView));
this.StatusRegion = _navigationService.GetView(typeof(StatusbarView));
此外,我可以在 MainContent 中导航内容,如下所示:
// Navigate to HomeView in MainRegion
_navigationService.NavigateRequest(typeof(HomeView));
NavigationService 通过 INavigationService 的公共属性绑定到菜单按钮,如下所示:
<Button Text="Results"
Command="{Binding NavigationService.NavigateCommand}"
CommandParameter="{Binding ResultsNavigateParameter}"/>