在分离项目时,MVVM会显示来自VM的新窗口

我的问题涉及到创造了一千零一个主题的问题,如果我忽略了我的问题的答案,我很抱歉,但就我看来,没有人真的可以回答我的问题。 例如: 在MVVM WPF中打开新窗口

如果您只使用一个WPF项目(包括模型,虚拟机和视图),那么答案是可以的,但是因为我正在学习如何以正确的方式实现MVVM(我已经多次阅读,最佳实践是创建单独的类lib (dll的)对于模型,viewmodel和一个单独的gui项目)似乎在我眼中不起作用,因为如果我想创建一个像IWindowService这样的接口(在之前的url上描述,也在这里 ,它是不可能访问Window或Control类的因为那时我应该引用gui项目,并且模式的整个目标都会被破坏。

所以我的问题是如何显示一个新的窗口(使用新的viewmodel),例如MainViewModel,同时尊重松散耦合的MVVM原则和单独的项目。

我正在努力实现的更深入的示例:

我有以下结构:

MODEL (DLL项目)
轮廓

VIEWMODEL (DLL项目)
MainViewModel
AddProfileViewModel

VIEW(WPF) (exe项目)
主窗口
AddProfileWindow

我打开MainWindow,我想按下AddProfile按钮,然后AddProfileWindow需要显示附加的AddProfileViewModel。

  • 在模型项目中定义IWindowService接口。
  • 从视图模型项目引用模型项目。
  • 在WPF应用程序(视图)项目中实现IWindowService

然后,该按钮应绑定到使用IWindowService打开窗口的ICommand 。 像这样的东西:

 public class MainWindowViewModel { private readonly IWindowService _windowService; public MainWindowViewModel(IWindowService windowService) { _windowService = windowService; AddProfile = new DelegateCommand(() => { _windowService.OpenProfileWindow(new AddProfileViewModel()); }); } public ICommand AddProfile { get; } } public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(new WindowService()); } } public class WindowService : IWindowService { public void OpenProfileWindow(AddProfileViewModel vm) { AddProfileWindow win = new AddProfileWindow(); win.DataContext = vm; win.Show(); } }