有三个窗口MainWindow,FirstWindow和SecondWindow。 MainWindow可以打开FirstWindow和SecondWindow。
现在我的问题是:
答案 0 :(得分:1)
你在这里要求多个人做多件事。
基本上你需要2件事。用于在视图模型之间传递消息的事件聚合器(也称为messenger)。有不同的框架可以实现它,或者它们是MVVM框架的一部分。
其次,您需要的是导航服务,以便将导航与视图模型分离,因为导航需要了解与视图相关的技术(WPF,UWP,Silverlight等)。
答案 1 :(得分:1)
我同意Tseng's answer并会尝试扩展他的答案。
第一部分
对于模块之间的低耦合通信(不仅是ViewModels),我们可以尝试实现EventAggregator模式。事件聚合器有助于在低耦合应用程序中实现订阅者/发布者模式。我知道几个不同的实现。
第一个基于CodeProject post并使用WeakReference来帮助您防止内存泄漏。我不会发布整个代码,因为您只需下载源代码并使用它。在此实现中,您必须为订阅者实现ISubscriber接口。
第二个是Microsoft Prism实施。这是一个开源项目,然后您可以看到interface,implementation和base event class。在此实现中,您必须手动取消订阅该事件。
第三个也是最后一个是MVVMLight库及其Messenger类。
正如您所看到的,所有这些实现都使用Singleton模式来保存订阅者。
第二部分
第二部分是关于导航。最简单的方法是使用Page navigation基础结构。但是在MVVM世界中,我们有许多不同的导航概念。
使用导航抽象的主要目的是将导航逻辑与具体的视图渲染技术(WPF,Silverlight,WinRT,Xamarin)分开。
例如,在Microsoft Prism中,我们可以使用区域和RegionManager在视图和窗口之间进行导航。它是非常笨重的导航框架,只有一篇文章后才能理解这个概念。
MVVM Light也有自己的navigation mechanism。
对于我的项目,我通过Workspaces使用自己的导航实现。它是一种混合机制,结合了来自Prism的.net和Regions概念的页面导航原理。
<强>结论强>
这篇文章不是你问题的答案。但我希望你能理解MVVM概念。
正如您在上面所读到的,有许多MVVM框架包含基础结构(不仅包括Messenger和NavigationService,还包括基本命令实现,PopupService,转换器,INotifyPropertyChanged - 帮助程序和base ViewModel实现)在您的应用程序中实现典型方案
答案 2 :(得分:-1)
您需要使用表单类的实例来传递数据。请参阅下面的简单两个表单项目
表格1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Form2 form2;
public Form1()
{
InitializeComponent();
form2 = new Form2(this);
}
private void button1_Click(object sender, EventArgs e)
{
form2.Show();
string results = form2.GetData();
}
}
}
表格2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
Form1 form1;
public Form2(Form1 nform1)
{
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(Form2_FormClosing);
form1 = nform1;
form1.Hide();
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
//stops form from closing
e.Cancel = true;
this.Hide();
}
public string GetData()
{
return "The quick brown fox jumped over the lazy dog";
}
}
}