未从命令收到 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
我正在使用 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