Wpf 未从命令接收到MVVM Light messenger消息
我正在使用MVVM Light框架构建一个WPF应用程序 我试图打开一个窗口,并将一些信息(即对象)传递给这个新创建的ViewModel 我有一个WPF窗口MainListView/MainListViewModel,它有一个绑定到对象列表的列表框: 在MainListView中,我还有一个绑定到命令的按钮: 私有ICommand_updateCommand; 公共ICommand更新命令 { 收到 { 如果_updateCommand==null { _updateCommand=new RelayCommand_WindowsService.OpenWindow,updateCommand_CanExecute; Messenger.Default.Sendnew UpdateLetterMessage{Letter=Selected_Letter}; } 返回_updateCommand; } } 这将使用AddViewLetterViewModel打开一个新窗口AddNewLetterView,该窗口由MVVM Light的ViewModelLocator链接 在AddNewLetterViewModel构造函数中,我执行以下操作: 公共AddNewLetterViewModel { Messenger.Default.Registerthis,UpdateLetterMessageReceived; } 问题是没有收到此消息。即使视图打开,UpdateLetterMessageReceived上的断点也不会命中 如果我在命令上设置断点,则当单击按钮时,即使打开了AddNewLetterView,也不会在AddNewLetterViewMdoel上命中该断点,也不会收到UpdateLetterMessage 似乎正在发生的是,在MainListViewModel实例化过程中,UpdateCommand被调用一次,这意味着消息是在AddNewLetterViewModel实例化之前发送的 对吗?如果是,如何确保在调用命令时发送消息Wpf 未从命令接收到MVVM Light messenger消息,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我正在使用MVVM Light框架构建一个WPF应用程序 我试图打开一个窗口,并将一些信息(即对象)传递给这个新创建的ViewModel 我有一个WPF窗口MainListView/MainListViewModel,它有一个绑定到对象列表的列表框: 在MainListView中,我还有一个绑定到命令的按钮: 私有ICommand_updateCommand; 公共ICommand更新命令 { 收到 { 如果_updateCommand==null { _updateCommand=new Re
如果没有,这里发生了什么,我如何才能做到这一点 更新命令需要如下所示:
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的简写形式谢谢Tim,这正是我所需要的。老实说,我不太明白有什么区别。执行_updateCommand=new RelayCommand有什么不同;和_updateCommand=newrelayCommand=>{};在实例化/执行时触发方面?传递到RelayCommand的第一个参数的是执行命令时执行的代码。=>{}允许您定义多行代码,而不仅仅是单个函数。创建命令时调用messenger.send调用,而不是执行命令时调用。啊,太棒了!这就很清楚了。我缺少的是RelayCommand的DoSomething参数。有时,速记版本会使人更难理解实际发生了什么,调用了什么以及何时调用。谢谢你的帮助。