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
相关产品推荐
相关产品推荐

