未收到来自命令的MVVM Light信使消息



我正在使用MVVM Light框架构建一个WPF应用程序。

我正在尝试打开一个窗口,并将一些信息(即对象(传递给这个新创建的ViewModel。

我有一个WPF窗口(MainListView/MainListViewModel(,它有一个绑定到对象列表的ListBox

<ListBox ItemsSource="{Binding Selected_Agent.Associated_Letter, Mode=OneWay}"
SelectedItem="{Binding Selected_Letter, Mode=TwoWay}">
<!-- More code below -->

MainListView中,我还有一个绑定到命令的按钮:

<Button Content="Update" Command="{Binding UpdateCommand}"/>
private ICommand _updateCommand;
public ICommand UpdateCommand
{
get
{
if (_updateCommand == null)
{
_updateCommand = new RelayCommand(_windowService.OpenWindow<AddNewLetterView>, UpdateCommand_CanExecute());
Messenger.Default.Send(new UpdateLetterMessage() { Letter = Selected_Letter });
}
return _updateCommand;
}
}

这将使用AddViewLetterViewModel打开一个新窗口AddNewLetterView,该窗口由MVVM Light的ViewModelLocator链接。

AddNewLetterViewModel构造函数中,我这样做:

public AddNewLetterViewModel()
{
Messenger.Default.Register<UpdateLetterMessage>(this, UpdateLetterMessageReceived);
}

问题是没有收到此消息。即使视图打开,UpdateLetterMessageReceived上的断点也不会被命中。

如果我在命令上设置了断点,即使AddNewLetterView已打开,当单击按钮时,它也不会被命中,AddNewLetterViewMdoel上的UpdateLetterMessageReceived也不会被击中。

似乎正在发生的是,UpdateCommand在MainListViewModel实例化期间被调用一次,这意味着Messenge是在AddNewLetterViewModel实例化之前发送的。

这是正确的吗?如果是,我如何确保在调用命令时发送我的消息?

如果没有,这里发生了什么,我如何才能做到这一点?

您的更新命令需要如下所示:

private ICommand _updateCommand;
public ICommand UpdateCommand
{
get
{
if (_updateCommand == null)
{
_updateCommand = new RelayCommand(() =>
{
_windowService.OpenWindow<AddNewLetterView> ();
Messenger.Default.Send(new UpdateLetterMessage() {Letter = Selected_Letter});
}, UpdateCommand_CanExecute);
}
return _updateCommand;
}
}

按照你的方式,它只是在命令第一次创建时发送消息,我相信你想在命令执行时发送它

顺便说一句,我发现这种命令结构更有用。让它看起来像一个正常的方法

public ICommand UpdateCommand => _updateCommand ?? (_updateCommand = new RelayCommand(() =>
{
_windowService.OpenWindow<AddNewLetterView> 
Messenger.Default.Send(new UpdateLetterMessage() {Letter = Selected_Letter});
}, UpdateCommand_CanExecute));

为了更清楚,你的功能是这样做的:

private ICommand _updateCommand;
public ICommand UpdateCommand
{
get
{
if (_updateCommand == null)
{
_updateCommand = new RelayCommand(DoSomething, CanDoSomething);
Messenger.Default.Send(etc); <=====THIS SHOULD BE....
}
return _updateCommand;
}
}
public void DoSomething()
{
_windowService etc
<=====.....HERE
}
public bool CanDoSomething() {}

我使用的((=>{}表示法是定义DoSomething 函数的简写

最新更新