【问题标题】:WPF MVVM compliant way to open viewsWPF MVVM 兼容方式打开视图
【发布时间】:2019-02-18 14:12:43
【问题描述】:

我很想找到一种简单且符合 MVVM 的方式, 从 MainWindow 打开一个新视图。

我已经完成了一些说明和教程。 但不知何故,没有一个真正起作用,或者是背后的代码混合在一起。

我想在按下按钮后打开一个视图并在其中编辑 ObservableCollection。

我已经在 App.xaml 中创建了 DataTemplates 并将 ViewModels 映射到相应的视图。 但我不知道如何通过另一个 ViewModel 的 ICommand 从 MainWindow (MainViewModel) 干净地打开一个单独的窗口。

【问题讨论】:

  • 我使用服务。它是一个公开接口的单独 dll,您可以从 ViewModel 或 View 调用它。它不会以这种方式破坏 MvvM。

标签: c# wpf mvvm


【解决方案1】:

您不应直接从MainWindowMainWindowViewModel 打开窗口。但是视图模型可能会使用一个服务来打开一个窗口:

public class MainWindowViewModel
{
    private readonly IWindowService _service;
    public MainWindowViewModel (IWindowService service)
    {
        _service = service;
    }

    //...
    public void OpenWindowExecuted()
    {
        _service.ShowWindow();
    }
}

服务:

public interface IWindowService
{
    void ShowWindow();
}

public class WindowService : IWindowService
{
    public void ShowWindow();
    {
        Window window = new Window()
        window.Show();
    }
}

您可以轻松地在单元测试中模拟服务。

【讨论】:

  • 非常感谢您的代码!如何通过 ViewModel 触发服务?
  • @br0ken.pipe:我已经在我的回答中向您展示了如何做到这一点的示例。请参阅OpenWindowExecuted() 方法。该方法可以从视图调用的命令中执行。
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 2020-03-29
  • 2011-06-19
  • 1970-01-01
  • 2014-05-12
  • 2013-07-07
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多