将棱镜区域管理和导航与MVVMLight集成

时间:2013-07-12 08:04:13

标签: wpf prism mvvm-light

在我目前的项目中,我正在使用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}"/>

0 个答案:

没有答案