0

下面的代码适用于视图的共享实例。现在我想要实现的是每次导航到ViewB我想要一个新的视图实例及其支持视图模型。我已经尝试了以下各种组合,但它们似乎最终都以RequestNavigate我第二次尝试导航到 ViewB 时默默失败而告终......

IsNaviagtionTarget在视图导航到一次后, 我也尝试设置为 false 。

引导程序:

public void Initialize()
{
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewA));
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewB));
}

视图B(类):

[RegionMemberLifetime(KeepAlive = false)]
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
internal partial class ViewB
{
    [ImportingConstructor]
    public ViewB(ViewBViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }
}

ViewBViewModel:

[Export(typeof(ViewBViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
internal class ViewBViewModel : BindableBase, INavigationAware
{
    public void OnNavigatedTo(NavigationContext navigationContext)
    {
    }

    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        return true;
    }

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }
}

ViewA 只是有一个带有命令的按钮,该命令调用:

ViewA 导航命令:

public override void Execute(object parameter)
{
    _regionManager.RequestNavigate(RegionNameConstants.MainRegion, new Uri(nameof(ViewB), UriKind.Relative));
}
4

1 回答 1

1

不要typeof(ViewB)在引导程序中向区域管理器注册:

public void Initialize()
{
    _regionManager.RegisterViewWithRegion(RegionNameConstants.MainRegion, typeof(ViewA));
}

并且由于您正在导航到 的 Uri nameof(ViewB),您还应该使用合同名称导出视图nameof(ViewB)

[Export(nameof(ViewB))]
[PartCreationPolicy(CreationPolicy.NonShared)]
[RegionMemberLifetime(KeepAlive = false)]
internal partial class ViewB
{
    [ImportingConstructor]
    public ViewB(ViewBViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }
}

然后,每次使用以下命令导航到 ViewB 时,您都应该获得一个新的 ViewB 实例:

_regionManager.RequestNavigate(RegionNameConstants.MainRegion, new Uri(nameof(ViewB), UriKind.Relative));
于 2017-01-26T17:01:14.000 回答