我这里有个学术问题。我阅读了这个问题WPF MVVM Get Parent from VIEW MODEL,并得出结论,ViewModel本身不应该打开任何窗口。因此,我现在使用Messenger向ViewModel的Window发送消息,Window打开了另一个窗口-- NewWindow。它工作得很好,但是如果NewWindow做了一些事情并得到一些Result,需要在MainWindow中传递,以便采取进一步的行动?更详细的是:
NewWindow在Window (OpenNewWindowCommand)中按一下按钮打开,并做了一些计算。NewWindow得到了一些Result (不管它到底是什么)并产生了一个相应的事件-- GotSomeResult,其中event是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
}((MetaWindowViewModel)DataContext).ProcessResult;newWindowViewModel.GotSomeResult += --这条线对我来说是个问题。访问ViewModel的公共方法在View中正确吗?这是暴力MVVM模式吗?
发布于 2014-06-17 12:24:21
为什么不将处理程序连接到VM级别的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();
}https://stackoverflow.com/questions/24263060
复制相似问题