从视图模型构造函数发送时未收到 MVVM 轻消息

本文关键字:MVVM 消息 模型 视图 构造函数 | 更新日期: 2023-09-27 18:37:06

我遇到了以下问题:

我正在ViewModelLocator中使用SimpleIoc注册4个ViewModels。在 MainViewModel 的构造器中,我向其他 3 个 ViewModel 中的 2 个发送了一条消息。这些视图模型不会接收这些消息。

消息

传递本身是有效的,因为当我稍后发送消息时,这些 ViewModels 会按预期做出反应。

因此,我希望接收视图模型在我从 MainViewModel 构造函数发送消息的那一刻没有侦听。所以我切换了我用SimpleIoc注册ViewModels的顺序,但无济于事。

我做错了什么?

视图模型定位器

    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<LoginMethodVM>();
        SimpleIoc.Default.Register<DatabaseConnDataVM>();
        SimpleIoc.Default.Register<UserCredentialsVM>();
        SimpleIoc.Default.Register<BrowserSelectionVM>();
        SimpleIoc.Default.Register<MainViewModel>();
    }
    public LoginMethodVM LoginMethodVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<LoginMethodVM>();
        }
    }
    public DatabaseConnDataVM DatabaseConnDataVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<DatabaseConnDataVM>();
        }
    }
    public UserCredentialsVM UserCredentialsVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<UserCredentialsVM>();
        }
    }
    public BrowserSelectionVM BrowserSelectionVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<BrowserSelectionVM>();
        }
    }

主视图模型

    public MainViewModel()
    {
        Messenger.Default.Send(System.Windows.Visibility.Visible, "UserCredentialsVisible");
        Messenger.Default.Send(System.Windows.Visibility.Visible, "BrowserSelectionVisible");
    }

浏览器选择虚拟机

    public BrowserSelectionVM()
    {
        Messenger.Default.Register<System.Windows.Visibility>
            (this,
            "BrowserSelectionVisible",
            msg => { Visible = msg; });
    }

用户凭据虚拟机

    public UserCredentialsVM()
    {
        Messenger.Default.Register<System.Windows.Visibility>
            (this,
            "UserCredentialsVisible",
            msg => { Visible = msg; });
    }

从视图模型构造函数发送时未收到 MVVM 轻消息

ViewModelLocator.cs

    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<UserCredentialsVM>(true);
        SimpleIoc.Default.Register<BrowserSelectionVM>(true);
        SimpleIoc.Default.Register<MainViewModel>();
    }
    public UserCredentialsVM UserCredentialsVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<UserCredentialsVM>();
        }
    }
    public BrowserSelectionVM BrowserSelectionVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<BrowserSelectionVM>();
        }
    }
    public MainViewModel MainViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }
    public static void Cleanup()
    {
    }

浏览器选择虚拟机

.cs
public class BrowserSelectionVM : ViewModelBase
{
    public BrowserSelectionVM()
    {
        Messenger.Default.Register<System.Windows.Visibility>(this,
            "BrowserSelectionVisible",
            msg => { Console.WriteLine(msg); });
    }
}

UserCredentialsVM

.cs
public class UserCredentialsVM : ViewModelBase
{
    public UserCredentialsVM()
    {
        Messenger.Default.Register<System.Windows.Visibility>(this,
            "UserCredentialsVisible",
            msg => { Console.WriteLine(msg); });
    }
}

主视图模型.cs

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        Messenger.Default.Send(System.Windows.Visibility.Visible, "UserCredentialsVisible");
        Messenger.Default.Send(System.Windows.Visibility.Visible, "BrowserSelectionVisible");
    }
}

MainWindow.xaml

<Window x:Class="MvvmLightRegistrationMock.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    DataContext="{Binding MainViewModel, Source={StaticResource Locator}}">
<Grid x:Name="LayoutRoot">
</Grid>