MVVM WPF更改窗口并关闭之前的

作为MVVM的所有架构的首发,我对一个窗口到另一个窗口之间的导航有一些疑问。 我正在使用Framework MVVM Light。

我期望的行为在WinForms中是这样的:

GeneralWindow gw = new GeneralWindow(); this.Hide(); //或关闭gw.Show();

我已经失去了几个小时试图使用信使找到一些提示,但我发现我必须在视图中使用代码隐藏的方法,这不是很MVVMish。

最好的问候,并提前感谢您。

我期望的行为在WinForms中是这样的:

GeneralWindow gw = new GeneralWindow(); this.Hide(); // or close gw.Show(); 

MVVM模式从ViewModel划分View 。 因此,它无法从ViewModel创建新View创建窗口实例并从视图模型显示窗口违反了MVVM“ 。所以我建议你使用流行的技术,你可以使用ContentControlDataTemplate更改Views

让我们深入研究这种技术:

            

如果Window.DataContextViewModelA的实例,则将显示Window.DataContext并且Window.DataContextViewModelB的实例,然后将显示ViewB

让我举一个例子,可以看到你应该放置DataTemplates

                       

我见过并阅读过的最好的例子是由Rachel Lim制作的。 查看示例。

更新:

如果你想真正打开新的Window,那么你应该创建一个中间层,使ViewModel不依赖于创建新窗口的具体实现。

 public class YourViewModel { private readonly IWindowFactory windowFactory; private ICommand openNewWindow; public YourViewModel(IWindowFactory _windowFactory) { windowFactory = windowFactory; /** * Would need to assign value to m_openNewWindow here, and * associate the DoOpenWindow method * to the execution of the command. * */ openNewWindow = null; } public void DoOpenNewWindow() { windowFactory.CreateNewWindow(); } public ICommand OpenNewWindow { get { return openNewWindow; } } } public interface IWindowFactory { void CreateNewWindow(); } public class ProductionWindowFactory: IWindowFactory { #region Implementation of INewWindowFactory public void CreateNewWindow() { NewWindow window = new NewWindow { DataContext = new NewWindowViewModel() }; window.Show(); } #endregion } 

如何关闭窗口?

有很多方法。 。 其中之一是:

 Application.Current.MainWindow.Close()