我提出这个问题是为了了解 Prism 库中的最佳实践。
基本上,我有一个 MainView
(定义了范围区域)。在下面的代码片段中,我将 MainView
注册为 Singleton,我这样做是为了解决并控制 Scoped RegionManager。但在解决问题上,它再次构建 MainView 实例。这真的很令人困惑,我不明白为什么?
之前我的方法是从 NavViewA.xaml
内导航到视图(例如 ViewA.xaml
--> TabNavigationRegion, MainViewModel
--> TabContentRegion)(其中作用域 RegionManager 可用),但后来我看到 @BrianLagunas 视频,解释此类绑定应进入 OnInitialized
,而不是从 ViewModel 中导航的视图(这是错误的方法)。
关于我如何解决这个问题的任何说明。
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RequestNavigate<MainView>(RegionNames.TabRegion);
// here wanna get hold on ScopedRegionManager of MainView to do this
var view = containerProvider.Resolve<MainView>();
// but this above statement create a new instance of MainView despite being marked Singleton in RegisterTypes
var scopedRegionManager = RegionManager.GetRegionManager(view);
scopedRegionManager.RequestNavigate<NavViewA>(RegionNames.TabNavigationRegion);
scopedRegionManager.RequestNavigate<ViewA>(RegionNames.TabContentRegion);
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<MainView>();
containerRegistry.RegisterForNavigation<MainView>();
}
主视图.xaml
<UserControl x:Class="PrismDemo.Module.Core.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:views="clr-namespace:PrismDemo.Core.Views;assembly=PrismDemo.Core"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<views:TabItemView />
</Grid>
</UserControl>
TabItemView.xaml
<UserControl x:Class="PrismDemo.Core.Views.TabItemView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:PrismDemo.Core"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="False">
<UserControl.Resources />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="40" />
<ColumnDefinition Width="2" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<ContentControl Grid.Column="0" prism:RegionManager.RegionName="{x:Static local:RegionNames.TabNavigationRegion}" />
<GridSplitter Grid.Column="1" Style="{StaticResource GridSplitterStyle}" />
<ContentControl Grid.Column="2" prism:RegionManager.RegionName="{x:Static local:RegionNames.TabContentRegion}" />
</Grid>
</UserControl>