MVVMLight - Messenger:从用户控件项目向exe项目发送消息不起作用

时间:2013-04-27 17:46:13

标签: wpf user-controls project mvvm-light messenger

我正在使用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)

1 个答案:

答案 0 :(得分:0)

App.xaml只是每个启动项目(exe)的一个文件。我假设UserControlProject仅用于控件而不是启动项目。因此,您可以从UserControlProject中删除app.xaml。并且将使用ExeProject中的app.xaml。

下一个代码

<vm:ViewModelLocator x:Key="Locator" />

说的是

  1. 对象vm:ViewModelLocator将在应用程序启动时创建一次,其唯一Key用于引用为Locator
  2. App.xaml是全球资源。所有控件和所有窗口都可以看到在其中创建的任何资源。
  3. 所以(在MVVMLight策略中)你应该只在App.xaml声明一次<vm:ViewModelLocator x:Key="Locator" />。然后你可以在用户控件中引用它,即使是在单独的程序集中

    <UserControl x:Class="WpfControlLibrary1.UserControl1"
                 DataContext="{Binding LoginSession, Source={StaticResource Locator}}" 
                 ... />