Wpf 未从命令接收到MVVM Light messenger消息

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

我正在使用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实例化之前发送的

对吗?如果是,如何确保在调用命令时发送消息


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

更新命令需要如下所示:

    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参数。有时,速记版本会使人更难理解实际发生了什么,调用了什么以及何时调用。谢谢你的帮助。