gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:36:12 26 4
gpt4 key购买 nike

我的问题涉及创建一千零一个主题的内容,如果我忽略了问题的答案,我很抱歉,但据我所知,没有人能真正回答我的问题。例如: 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com