You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prism:导航时复用View实例的问题及IsNavigationTarget未触发排查

摘要

点击按钮时调用RequestNavigate,希望将ContentRegion中的MainView实例移入DialogContentRegion,但当前每次调用都会创建新的MainView实例插入到DialogContentRegion中。

详细说明

需求示意图:
示意图

  • ContentRegion为主区域,包含MainView;
  • DialogView在ContentControl中包含DialogContentRegion区域;
  • MainViewModel的PinModuleCommand使用IDialogService显示对话框;
  • DialogViewModel在对话框打开时调用RegionManager.RequestNavigate()在DialogContentRegion中显示视图;
  • 使用IContainerRegistry注册视图,代码如下:
public void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<MainView>();
    containerRegistry.RegisterDialog<DialogView>();
}

全程使用同一个RegionManager。

  • DialogView.xaml代码:
<UserControl x:Class="Infrastructure.Views.DialogView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Infrastructure.Views"
             xmlns:prism="http://prismlibrary.com/" xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
             prism:ViewModelLocator.AutoWireViewModel="True"
             mc:Ignorable="d">
    <ContentControl x:Name="_contentControl" prism:RegionManager.RegionName="DialogContentRegion"/>
</UserControl>
  • DialogView.xaml.cs代码:
public partial class DialogView : UserControl
{
    IRegionManager _regionManager;
    public DialogView(IRegionManager regionManager)
    {
        InitializeComponent();
        _regionManager = regionManager;

        if (!_regionManager.Regions.ContainsRegionWithName("DialogContentRegion"))
        {
            RegionManager.SetRegionManager(_contentControl, _regionManager);
        }
    }
}
  • DialogViewModel.cs代码:
public class DialogViewModel : BindableBase, IDialogAware
{
    IRegionManager _regionManager;

    private string _title;
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }

    private string _view;
    public string View
    {
        get { return _view; }
        set { SetProperty(ref _view, value); }
    }

    public PinDialogViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
    }

    public event Action<IDialogResult> RequestClose;

    public bool CanCloseDialog()
    {
        return true;
    }

    public void OnDialogClosed()
    {
        _regionManager.Regions.Remove("DialogContentRegion");
    }

    public void OnDialogOpened(IDialogParameters parameters)
    {
        View = parameters.GetValue<string>("view");

        if (_regionManager.Regions.ContainsRegionWithName("DialogContentRegion"))
        {
            _regionManager.RequestNavigate("DialogContentRegion", View);
        }
    }
}
  • MainViewModel.cs代码:
public class MainViewModel : BindableBase, INavigationAware
{
    private DelegateCommand _pinModuleComamnd;
    public DelegateCommand PinModuleCommand =>
        _pinModuleComamnd ?? (_pinModuleComamnd = new DelegateCommand(ExecutePinModuleCommand));

    public MainViewModel()
    {
        
    }

    void ExecutePinModuleCommand()
    {
        _dialogService.Show(nameof(PinDialogView), new DialogParameters { { "view", "MainView" } }, DialogCallback);
    }

    private void DialogCallback(IDialogResult dialogResult)
    {

    }

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        
    }

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

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
        
    }
}

预期行为

在DialogContentRegion中导航到MainView时,对话框中的视图实例与主窗口中的实例一致。

实际行为

每次导航都会创建新的视图实例。

补充问题

在对话框中导航时,MainViewModel中的IsNavigationTarget()从未被调用,原因是什么?


内容的提问来源于stack exchange,提问作者johann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:01:43