2013-04-27 47 views
0

我正在使用Messenger类在应用程序中广播消息。 解决方案结构:MVVMLight - Messenger:从用户控制项目发送消息到exe项目不起作用

UserControlProject
- 使用的App.xaml

的ucContainer - ucContainer
- ucContainerViewModel
- ucLogin
- App.xaml中

ExeProject
- 主窗口
在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 });

问题:在主窗口的消息没有收到。为什么?从相同的程序集中,它正在工作...在ucContainerViewModel中,消息已成功接收。

问题(与Messenger无关):app.xaml存在于两个项目中。两者都包含<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />系列。这对我来说还不完全清楚,它是需要的吗?定位器应该在哪里定义为资源定义 - 在每个使用mvvm light vm概念的项目中,还是仅在应用程序项目中?

(mvvmlight:4.1.27,VS2013,NET4.5)

+0

对于我来说消息正在工作。你能解释一下关于视图和视图模型的更多细节吗? – Artru 2013-05-02 15:40:06

回答

0

App.xaml中只有一个为每个启动项目文件(EXE)。我假设UserControlProject仅用于控件,并不是启动项目。所以你可以从UserControlProject中移除app.xaml。并且将使用ExeProject中的app.xaml。

下一个代码

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

是说,

  1. 对象vm:ViewModelLocator将在应用程序启动创建一次和他独特的Key的引用是Locator
  2. App.xaml是全球资源。在其中创建的任何资源都将在所有控件和所有窗口中可见。

因此(在MVVMLight策略中)您应该在App.xaml中声明<vm:ViewModelLocator x:Key="Locator" />一次。然后你可以参考它在用户控制,即使在单独的大会作为

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