在我目前的项目中,我正在使用MVVMLight框架。
我在浏览之间导航时遇到了一些困难。目前,我正在使用DataTemplates在Views之间导航。但是,每次导航到另一个视图时,都会重新创建此视图。另外,我正在使用嵌套视图。总之,我觉得我需要一个更高级的框架来管理基于视图的导航。
我在考虑使用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}"/>