c# - 绕过循环依赖

标签 c# wpf mvvm

我可以就我遇到的关于将项目分成不同层的小问题寻求帮助吗?在我的 ViewModel 逻辑中,我有代码,在单击按钮时创建一个新的窗口实例(为此我使用 ICommand 接口(interface))

然而问题是,这需要我在表示层中的 View 文件夹,我无法访问它,因为我的表示层依赖于我在逻辑层中的 ViewModel。

我只是将处理页面创建的代码移动到后面的 View 代码中,但我还将 View 模型的当前实例作为正在创建的新窗口的参数传递(用于事件处理目的)。

任何帮助深表感谢!谢谢。

最佳答案

View 模型不应创建窗口实例。您可以做的是为您的 View 模型注入(inject)一个负责创建窗口的服务,例如:

public class MainWindowViewModel
{
    private readonly IWindowService _windowService;

    public MainWindowViewModel(IWindowService windowService)
    {
        _windowService = windowService;
        CreateWindowCommand = new DelegateCommand(() =>
        {
            _windowService.CreateWindow(new SomeViewModel());
        });
    }

    public ICommand CreateWindowCommand { get; }
}

定义 IWindowService View 模型项目中的接口(interface)及其在 View /表示项目中的具体实现:
public class WindowService : IWindowService
{
    public void CreateWindow(SomeViewModel vm)
    {
        Window win = new Window();
        win.DataContext = vm;
        win.Show();
    }
}

关于c# - 绕过循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54216793/

相关文章:

c# - UIElementCollection 和 Collection<UIElement> 之间的区别?

c# - 使用 Prism MVVM 的 OpenFileDialog

.net - mvvm-light 工具包未触发 Window Loaded 事件

c# - 是否可以将 C# 事件处理程序推迟到其他处理程序被调用之后?

c# - 如何避免转换到特定界面

wpf - 在Windows XP上显示汉字

c# - 具有异步服务初始化的竞争条件

c# - asp net core viewmodel参数转换为字符串url

c# - 使用 Transform 在 Silverlight 中旋转图像(控件)

wpf - GetLocalValueEnumerator() 未返回所有属性