c# - MVVM 在分离项目时显示来自 VM 的新窗口

标签 c# wpf design-patterns mvvm

我的问题涉及创建一千零一个主题的内容, 如果我忽略了问题的答案,我很抱歉,但据我所知,没有人能真正回答我的问题。例如: Opening new window in MVVM WPF

如果您只使用一个 WPF 项目(包括模型、虚拟机和 View ),答案是可以的,但是因为我正在学习如何以正确的方式实现 MVVM(而且我多次阅读最佳实践是创建模型、 View 模型和单独的 gui 项目的单独类库(dll))在我看来似乎不起作用,因为如果我想创建一个像 IWindowService 这样的接口(interface)(在前面的 url 和 here 中描述,就不可能访问 Window或 Control 类,因为那时我应该有一个对 gui 项目的引用,并且该模式的整个目标都被破坏了。

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

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

我有以下结构:

MODEL(dll 项目)
简介

VIEWMODEL(dll 项目)
主视图模型
添加配置文件 View 模型

VIEW (WPF)(exe 项目)
主窗口
添加配置文件窗口

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

最佳答案

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

然后按钮应绑定(bind)到使用 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();
    }
}

关于c# - MVVM 在分离项目时显示来自 VM 的新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47352870/

相关文章:

c# - Microsoft Enterprise Library 有用吗?

c# - 提供读取的 LINQtoCSV 流为空,或不支持查找

c# - 在扩展器关闭时缩小窗口大小

java - 我需要一种设计模式,用于在对象中存储对仅在需要时创建的其他对象的引用

c# - 我需要一种模式来对 C# 中的对象应用一些验证

performance - 胖域模型=>低效率?

c# - 如何在文本框中绑定(bind) gridview 以及如何在 asp.net 中计算总值

c# - 仅适用于 ie8 的复选框样式表

wpf - 如何 bool 值&& 两个可见性转换器

wpf - 如何为 WPF 用户控件重新定义 FocusVisualStyle