Prism:Viewmodel构造函数被调用两次

问题描述 投票:0回答:1

我正在使用棱镜。我有一个视图(DetailMainUC.xaml),它以下面的方式保存许多其他视图。

 <UserControl.Resources>
    <DataTemplate x:Key="View1Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:HomeUC />
    </DataTemplate>
    <DataTemplate x:Key="View2Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:WalkAwayBehaviorUC />
    </DataTemplate>
    <DataTemplate x:Key="View3Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:WakeUpOnApproachUC />
    </DataTemplate>
    <DataTemplate x:Key="View4Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:NoLockOnPresenceUC />
    </DataTemplate>
    <DataTemplate x:Key="View5Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:PeekDimmingUC />
    </DataTemplate>
    <DataTemplate x:Key="View6Template" DataType="{x:Type vm:DetailMainUCViewModel}">
        <local:SettingsUC />
    </DataTemplate>
</UserControl.Resources>
<Grid>
    <ContentControl Grid.Column="1" Grid.Row="1" Content="{Binding }">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SwitchView}" Value="Home">
                        <Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SwitchView}" Value="Walk Away Behaviour">
                        <Setter Property="ContentTemplate" Value="{StaticResource View2Template}"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SwitchView}" Value="Wake up on approach">
                        <Setter Property="ContentTemplate" Value="{StaticResource View3Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SwitchView}" Value="No lock on presence">
                        <Setter Property="ContentTemplate" Value="{StaticResource View4Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SwitchView}" Value="Peeking and Dimming">
                        <Setter Property="ContentTemplate" Value="{StaticResource View5Template}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SwitchView}" Value="Settings">
                        <Setter Property="ContentTemplate" Value="{StaticResource View6Template}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</Grid>

现在,我正在使用事件聚合器在其他区域的不同视图模型之间进行通信。 usercontrol的我的视图模型如下:

public DetailMainUCViewModel(IEventAggregator eventAggregator, HomeViewModel homeViewModel)
    {
        this.HomeVM = homeViewModel;
        this._eventAggregator = eventAggregator;
        HomeVM.Initialization(this._eventAggregator);
        this._eventAggregator.GetEvent<MenuClickEvent>().Subscribe(GetMenuName);
        SwitchView = "Home";

    }

现在属性HomeVM的类型为HomeViewModel,这是子级DetailMainUCViewModel的视图模型。像这样,还有许多其他子视图模型。现在我的问题是,我看到HomeViewModel的构造函数被调用了两次,并且所有其他子视图模型也都发生了同样的情况。

我面临的主要问题是第二次调用子视图模型时,eventAggregator变为null

任何帮助表示赞赏。下图显示了首先调用HomeViewModel的构造函数的调用堆栈enter image description here

下图显示了对第二次调用HomeViewModel的构造函数的调用堆栈

enter image description here

DetailsMainUCViewModel是父视图模型,而HomeViewModel是子视图模型。DetailMainUC.xaml以代码部分中提到的方式保存HomeUC.xaml。

我也写了下面提到的代码

<UserControl.DataContext>
    <vm:HomeViewModel></vm:HomeViewModel>
</UserControl.DataContext>

我怀疑是因为我在两个地方使用附加数据上下文,所以我的视图模型被调用了两次。

  1. 在HomeUC.xaml中]

  2. 父用户控件DetailMainUC.xaml

  3. 但是我无法根据需要删除它们。

我的班级设计是DetailMainUCViewModel是父视图模型,而HomeViewModel是子视图模型。DetailMainUC.xaml是父视图,而HomeUC.xaml是子视图。首先,我给出的代码片段来自DetailMainUC.xaml(包含所有子用户控件)问候


@@ BionicCode我的问题太大了,因此无法进一步编辑。因此,我在这里回答您的问题。

  1. DetailMainUCUCModel.cs的实例
  2. enter image description here

除此之外,我正在实现IModule接口的模块中初始化DetailMainUC.xaml。>

public class STDetailOptionsModule : IModule
{
    private readonly IRegionManager _regionManager;
    public STDetailOptionsModule(IRegionManager regionManager)
    {
        this._regionManager = regionManager;
    }

    public void OnInitialized(IContainerProvider containerProvider)
    {
        _regionManager.RegisterViewWithRegion(RegionNames.DetailOptionsRegion, typeof(DetailMainUC));
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {

    }
}

我正在使用棱镜。我有一个视图(DetailMainUC.xaml),它以以下方式保存许多其他视图。 [

c# wpf mvvm prism prism-4
1个回答
-1
投票

@@ BionicCode我的问题太大了,因此无法进一步编辑。因此,我在这里回答您的问题。

  1. DetailMainUCUCModel.cs的实例
© www.soinside.com 2019 - 2024. All rights reserved.