1

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

0 回答 0