我正在使用Messenger类在应用程序中广播消息。 解决方案结构:
UserControlProject
- ucContainer
- ucContainerViewModel
- ucLogin
- app.xaml
ExeProject
- MainWindow
- app.xaml
ucContainer用于MainWindow。
在MainWindow构造函数中:
Messenger.Default.Register<LoginSession>(this, OnLoggedIn);
在ucContainerViewModel构造函数中:
Messenger.Default.Register<LoginSession>(this, OnLoggedIn);
在后面的ucLogin代码中:
Messenger.Default.Send<LoginSession>(new LoginSession() { UserName = txtUserName.Text, LoggedInAt = DateTime.Now });
问题:在MainWindow中,邮件未收到。为什么?它在同一个程序集中工作...在ucContainerViewModel中成功收到消息。
问题(与Messenger无关):app.xaml存在于两个项目中。两者都包含<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
行。我不完全清楚它是否需要它?应该将定位器作为资源定义在哪里 - 在每个使用mvvm light vm概念的项目中或仅在应用程序项目中?
(mvvmlight:4.1.27,VS2013,NET4.5)
答案 0 :(得分:0)
App.xaml只是每个启动项目(exe)的一个文件。我假设UserControlProject仅用于控件而不是启动项目。因此,您可以从UserControlProject中删除app.xaml。并且将使用ExeProject中的app.xaml。
下一个代码
<vm:ViewModelLocator x:Key="Locator" />
说的是
vm:ViewModelLocator
将在应用程序启动时创建一次,其唯一Key
用于引用为Locator
。所以(在MVVMLight策略中)你应该只在App.xaml声明一次<vm:ViewModelLocator x:Key="Locator" />
。然后你可以在用户控件中引用它,即使是在单独的程序集中
<UserControl x:Class="WpfControlLibrary1.UserControl1"
DataContext="{Binding LoginSession, Source={StaticResource Locator}}"
... />