0

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

4

1 回答 1

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 策略中)您应该<vm:ViewModelLocator x:Key="Locator" />只在 App.xaml 中声明一次。然后,即使在单独的程序集中,您也可以在用户控件中引用它

<UserControl x:Class="WpfControlLibrary1.UserControl1"
             DataContext="{Binding LoginSession, Source={StaticResource Locator}}" 
             ... />
于 2013-05-02T15:16:14.233 回答