未从命令收到 MVVM Light Messenger 消息

MVVM Light messenger message not received from Command

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

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

我有一个 WPF window (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;
    }
}

这将打开一个新的 window,AddNewLetterView 使用 AddViewLetterViewModel,它由 MVVM Light 的 ViewModelLocator.

链接

AddNewLetterViewModel 构造函数中我这样做:

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

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

如果我在命令上放置断点,它永远不会命中,AddNewLetterViewMdoel 上的 UpdateLetterMessageReceived 也不会命中,当单击按钮时,即使 AddNewLetterView 已打开.

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

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

如果不是,这是怎么回事,我该如何实现?

你的更新命令需要是这样的:

    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() {}

我使用的 () => {} 表示法是 shorthand 用于定义函数 DoSomething