如何在松散耦合的应用程序中从ViewModel创建窗口?WPF

如何在松散耦合的应用程序中从ViewModel创建窗口?WPF,wpf,mvvm,dependency-injection,inversion-of-control,loose-coupling,Wpf,Mvvm,Dependency Injection,Inversion Of Control,Loose Coupling,我有三个项目——“Bootstrapper”、“ApplicationView”和“Presentation” 项目“Bootstrapper”具有运行主窗口的app.xaml.cs文件 “ApplicationView”项目只有必要的Windows—MainWindows.xaml、PersonWindow.xaml、SchoolWindows.xaml 项目“演示”具有ViewModels类和接口 在我的viewmodel中,我想撤销一个窗口。但是我应该在哪里创建窗口对象呢?我读过一篇文

我有三个项目——“Bootstrapper”、“ApplicationView”和“Presentation”

  • 项目“Bootstrapper”具有运行主窗口的app.xaml.cs文件
  • “ApplicationView”项目只有必要的Windows—MainWindows.xaml、PersonWindow.xaml、SchoolWindows.xaml
  • 项目“演示”具有ViewModels类和接口
在我的viewmodel中,我想撤销一个窗口。但是我应该在哪里创建窗口对象呢?我读过一篇文章,说我应该在App.xaml.cs文件中创建类的所有实例。但是如何从viewModel在App.xaml.cs调用此对象?我无法在ViewModel类中创建对象,因为我无法将“BootStrapper”的引用添加到“Presentation”中,因为VS 2010引发了一个错误——“将此项目添加为引用将导致循环依赖关系”

“Bootstrapper”项目的App.xaml.cs:

“演示”项目的MainWindowViewModel.cs:


如何从Presentation project的MainWindowViewModel.cs调用“Presentation”项目的SuperWindow.xaml?我无法将“BootStrapper”的引用添加到“Presentation”中,因为VS2010抛出了一个错误——“将此项目添加为引用将导致循环依赖”

我并不完全理解我们的问题,但我假设您正在尝试构建一个窗口,然后从viewmodel中弹出一个窗口。这可能是一个答案。在ViewModel中放置一个动作或func委托以执行所需的外部动作。您可以像这样将其传递到viewmodel的构造函数中

Action newFormAction = () => {
       var salut = new ServiceSalutation();
       var salutViewModel = new SuperWindowViewModel(salut);
       var newForm = new SuperWindow(salutViewModel);
       newForm.Show();
   };

var viewModel = new PeopleViewerViewModel(repository, newFormAction);

然后,在viewmodel中,您可以调用操作来创建弹出窗口,而不需要引用表示层

这看起来很糟糕。我会重构代码并采用一个MVVM框架,如Claiburn.Micro等。你可以自己设置一个视图来查看模型管理器,但这没有真正的意义,除非你从零开始学习MVVM…@Killercam,是的,我从零开始学习一个糟糕的耦合,但我在简单的MVVM中创建新窗口没有问题。此外,这段代码是plyralsight团队松散耦合的一个例子。我很难在这里提出建议,因为这可能是一个非常重要的解决方案……我曾经推出过自己的MVVM框架,我处理这段代码的方式是提供一个服务,其中viewmodels与相关视图(windows)注册,viewmodels可能依赖于此服务(它是一个单例)。然后,viewmodel或引导程序可以“请求”服务为给定的viewmodel创建视图,服务实例化并显示窗口,并设置
DataContext
。这将违反MVVM,因为viewmodel依赖于视图的具体实现。。。这正是MVVM想要避免的。处理窗口/视图的正确方法是通过依赖项注入(在引导程序中将视图绑定到ViewModel,这样您就不会因为依赖关系而污染ViewModel。或者使用ViewLocator/服务或更复杂的内容NavigationServices传递操作或函数委托并不违反MVVM。@DeanChalk,但我无法添加SuperWindow.xaml的引用,因此我的ViewModel类无法看到任何内容。)“Windows.xaml"如果要从viewmodel中弹出视图,这是不违反MVVM的最佳方法。如果要通过viewmodel与视图交互,请事先将视图与同一viewmodel绑定。也许您知道一些松散耦合的应用程序示例,其中一个窗口撤销另一个窗口?有些链接非常有用有用。
    void NewForm(object parameter)
    {
        //New Window
        /*/var salut = new ServiceSalutation();
        //var salutViewModel = new SuperWindowViewModel(salut);*/
        //var NewForm = new SuperWindow();
        How can I revoke a SuperWindow.xaml from a project "ApplicationView"?
    }
Action newFormAction = () => {
       var salut = new ServiceSalutation();
       var salutViewModel = new SuperWindowViewModel(salut);
       var newForm = new SuperWindow(salutViewModel);
       newForm.Show();
   };

var viewModel = new PeopleViewerViewModel(repository, newFormAction);