从视图模型构造函数发送时未收到 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; });
}
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()
{
}
浏览器选择虚拟机
.cspublic class BrowserSelectionVM : ViewModelBase
{
public BrowserSelectionVM()
{
Messenger.Default.Register<System.Windows.Visibility>(this,
"BrowserSelectionVisible",
msg => { Console.WriteLine(msg); });
}
}
UserCredentialsVM
.cspublic 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>