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

时间:2014-03-21 10:43:53

标签: wpf mvvm dependency-injection inversion-of-control loose-coupling

我有三个项目 - " Bootstrapper"," ApplicationView"和"演示"。

  • 一个项目" Bootstrapper"有运行MainWindow的app.xaml.cs文件
  • 一个项目" ApplicationView"只需要Windows - MainWindows.xaml,PersonWindow.xaml,SchoolWindows.xaml。
  • 一个项目"演示"有ViewModels类和接口

在我的viewmodel中,我想撤销一个窗口。但是我应该在哪里创建一个窗口的对象?我读过一篇文章,我应该在App.xaml.cs文件中创建所有类的实例。但是如何从viewModel在App.xaml.cs中调用此对象?我无法在ViewModel类中创建对象,因为我无法添加" BootStrapper"到"演讲"因为VS 2010会抛出错误 - "添加此项​​目作为参考将导致循环依赖"。

" Bootstrapper"的App.xaml.cs项目:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        ComposeObjects();
        Application.Current.MainWindow.Title = "Loose Coupling - People Viewer";
        Application.Current.MainWindow.Show();
    }

    private static void ComposeObjects()
    {
        //MainWindow
        var repository = new ServiceRepository();            
        var viewModel = new PeopleViewerViewModel(repository);
        Application.Current.MainWindow = new MainWindow(viewModel);
        //SuperWindow
        var salut = new ServiceSalutation();
        var salutViewModel = new SuperWindowViewModel(salut);
        var NewForm = new SuperWindow(salutViewModel);
    }

MainWindowViewModel.cs" Presentation"项目:

    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"?
    }

如何调用"演示文稿"的SuperWindow.xaml来自Presentation项目的MainWindowViewModel.cs的项目?我无法添加" BootStrapper"到"演讲"因为VS 2010会抛出错误 - "添加此项​​目作为参考将导致循环依赖"。

1 个答案:

答案 0 :(得分:1)

我真的不完全理解我们的问题,但我假设你正在尝试构建然后从你的viewmodel弹出一个窗口。这可能是一个答案。在ViewModel中放置一个action或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中,您可以调用操作来创建弹出窗口,而无需引用表示层