避开循环依赖

时间:2019-01-16 12:10:07

标签: c# wpf mvvm

在将项目分成不同的层时遇到的一个小问题能否获得帮助。在我的ViewModel逻辑中,我有代码,在其中单击按钮时将创建窗口的新实例(为此,我使用ICommand接口)

但是问题是,这需要我位于表示层中的View文件夹,由于该表示层依赖于逻辑层中的ViewModel,因此无法访问它。

我只是将处理页面创建的代码移到了后面的视图代码中,但是我还将viewmodel的当前实例作为要创建的新窗口的参数(出于事件处理的目的)传递。

非常感谢您的帮助!谢谢。

1 个答案:

答案 0 :(得分:3)

视图模型不应创建Windows实例。您可以做的是向视图模型注入负责创建窗口的服务,例如:

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接口,并在视图/表示项目中定义它的具体实现:

public class WindowService : IWindowService
{
    public void CreateWindow(SomeViewModel vm)
    {
        Window win = new Window();
        win.DataContext = vm;
        win.Show();
    }
}