首页 > 解决方案 > Prism 库 - 在视图中获取范围区域

问题描述

我提出这个问题是为了了解 Prism Library 中的最佳实践。

基本上,我有一个MainView(定义了范围区域)。在下面的代码片段中,我注册MainViewSingleton,我这样做是为了解决并掌握 Scoped RegionManager。但是在解决的问题上,它再次构造了 MainView 实例。这真的很混乱,我不明白为什么?

早些时候,我的方法是从内部(范围内的 RegionManager 可用)导航到视图(例如NavViewA.xaml--> TabNavigationRegion,ViewA.xaml--> TabContentRegion),MainViewModel但后来我看到@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>

标签: wpfprism

解决方案


推荐阅读