【问题标题】:MEF, Prism and new view instance on navigationMEF、Prism 和导航上的新视图实例
【发布时间】:2017-01-26 15:21:44
【问题描述】:

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

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

引导程序:

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

ViewB(类):

[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));
}

【问题讨论】:

    标签: wpf mef prism-6


    【解决方案1】:

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

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

    由于您正在导航到 nameof(ViewB) 的 Uri,因此您还应该导出合同名称为 nameof(ViewB) 的视图:

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

    然后,每次导航到 ViewB 时,您都应该获得一个新实例:

    _regionManager.RequestNavigate(RegionNameConstants.MainRegion, new Uri(nameof(ViewB), UriKind.Relative));
    

    【讨论】:

    • 神奇之处在于 nameof(ViewB),无需我在答案中使用的额外寄存器即可工作。好电话。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多