我在这里有一些学术问题。我读了这个问题WPF MVVM Get Parent from VIEW MODEL并得出结论,ViewModel
本身不应该打开任何窗口。因此,我现在使用Messenger
向ViewModel
Window
发送消息,Window
打开其他窗口 - NewWindow
。它运行正常,但如果NewWindow
执行某些操作并获得一些Result
,必须在MainWindow
中传递以进行进一步操作,该怎么办?更详细:
NewWindow
按钮点击Window
(OpenNewWindowCommand)并进行了一些计算。NewWindow
得到了一些Result
(确切意义到底是什么)并引发相应的事件 - GotSomeResult
,其中事件arg为Result
Result
必须在MainWindow
中传递给进一步处理,因此我将事件处理程序绑定到GotSomeResult
事件。 下面您可以看到所有必需的代码来说明这种情况。
MainWindow代码隐藏:
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
Messenger.Default.Register<NewWindowMessage>(this, OpenNewWindow);
}
private void OpenNewWindow(NewWindowMessage message)
{
var newWindow = new NewWindow();
var newWindowViewModel = (NewWindowViewModel) message.Target;
newWindowViewModel.GotSomeResult += ((MetaWindowViewModel)DataContext).ProcessResult;
newWindow.Owner = this;
newWindow.DataContext = newWindowViewModel;
newWindow.ShowDialog();
}
MainWindow ViewModel:
public void OpenNewWindowCommand()
{
Messenger.Default.Send(new NewWindowMessage(this, new NewWindowViewModel("OpenWindow"), String.Empty));
}
public void ProcessResult(Object someResult)
{
// Any actions with result
}
newWindowViewModel.GotSomeResult + =((MetaWindowViewModel)DataContext).ProcessResult; ---这个字符串对我来说似乎有问题。在ViewModel
中访问View
的公共方法是否正确?它是暴力MVVM
模式吗?
答案 0 :(得分:2)
为什么不在虚拟机级别将处理程序挂钩到GotSomeResult
,即:
public void OpenNewWindowCommand()
{
var newWindowViewModel = new NewWindowMessage(this, new NewWindowViewModel("OpenWindow"), String.Empty)
newWindowViewModel.GotSomeResult += this.ProcessResult;
Messenger.Default.Send();
}
它删除了代码隐藏中对ViewModel的引用(确实应该避免):
private void OpenNewWindow(NewWindowMessage message)
{
var newWindow = new NewWindow();
newWindow.Owner = this;
newWindow.DataContext = message.Target;
newWindow.ShowDialog();
}