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