我正在使用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 函数的简写