C# 从ViewModel构造函数发送时未收到MVVM灯光消息
我有以下问题: 我正在ViewModelLocator中向SimpleIoc注册4个ViewModels。 在MainViewModel的构造函数中,我向其他3个ViewModel中的2个发送了一条消息。 这些ViewModels未收到这些消息 消息本身是有效的,因为当我稍后在ViewModels上发送消息时,这些模型的反应与预期一致 因此,我希望在我从MainViewModel构造函数发送消息时,接收到的ViewModels没有监听。因此,我切换了向SimpleIoc注册ViewModels的顺序,但没有效果 我做错了什么 ViewModelLocatorC# 从ViewModel构造函数发送时未收到MVVM灯光消息,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我有以下问题: 我正在ViewModelLocator中向SimpleIoc注册4个ViewModels。 在MainViewModel的构造函数中,我向其他3个ViewModel中的2个发送了一条消息。 这些ViewModels未收到这些消息 消息本身是有效的,因为当我稍后在ViewModels上发送消息时,这些模型的反应与预期一致 因此,我希望在我从MainViewModel构造函数发送消息时,接收到的ViewModels没有监听。因此,我切换了向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>();
}
}
BrowserSelectionVM
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; });
}
公共浏览器选择VM()
{
Messenger.Default.Register
(本,
“BrowserSelectionVisible”,
msg=>{Visible=msg;});
}
UserCredentialsVM
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; });
}
public UserCredentialsVM()
{
Messenger.Default.Register
(本,
“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()
{
}
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>
当您从MainViewModel发送消息时,这些视图模型是否实例化?我的直觉是,接收者不是,但我无法判断,更改顺序也没有帮助。因此,如果您没有在内存中创建视图模型的实例,则Register命令不会运行,因此没有注册任何内容来接收消息。尝试这样做,在MainViewModel构造函数调用Sends之前,为每个视图模型创建一个实例。SimpleIOC与此问题无关,因为它所做的只是注入到视图模型中,而您的视图模型中没有要注入的构造函数参数。视图模型是由ServiceLocator…GetInstance创建的,我猜注册VieModel时调用它。否,视图模型只有在创建它们的实例后才会被创建,方法是直接在某个地方的代码中打开它们的实例(UserCredentialVM test=new UserCredential();),或者让它们通过打开视图模型是XAML中的数据上下文的视图(DataContext=)来使用视图模型定位器{Binding UserCredentialVM,Source={StaticResource Locator}}}”).ServiceLocator不会自动创建视图模型的实例。只需在正在注册的视图模型的构造函数中放置一个断点,以在调用发送消息之前查看它是否未注册。我看不到任何区别。@MPL我无法再现您看到的内容。在我的测试环境中,我可以看到这两个断点我已经更新了我的答案并发布了测试环境中的代码。
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
Messenger.Default.Send(System.Windows.Visibility.Visible, "UserCredentialsVisible");
Messenger.Default.Send(System.Windows.Visibility.Visible, "BrowserSelectionVisible");
}
}
<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>