4

我正在尝试使用 PRISM 创建一个模块,现在我在 View 中设置了 DataContext,这意味着我只能使用无参数构造函数,但这意味着我不能在我想要的构造函数中使用依赖注入(我使用 Unity)

如果可能的话,我不希望视图或虚拟机彼此了解并想使用类似的东西

private void RegisterServices()
{
    var employeeViewModel = new EmployeeViewModel();

    _container.RegisterType<IEmployeeViewModel, EmployeeViewModel>();
    _container.RegisterType<EmployeeView>();

    EmployeeView.Datacontext = employeeViewModel;
}

我将在 EmployeeModule 中注册

这是可能的还是我应该使用后面的代码?

4

2 回答 2

2

您可以将 的接口传递ViewModelView构造函数中的 。这样,View只知道接口ViewModelViewModelView.

前任。

public class EmployeeView : UserControl
{
    public EmployeeView(IEmployeeViewModel vm)
    {
         this.DataContext = vm; //// better to set the ViewModel in the Loaded method
    }
}

有关 MVVM 实例化的多种方法,请参阅此博客文章

于 2013-02-14T07:57:38.260 回答
1

Prism 文档为您提供了一个选项

通常,您会发现定义控制器或服务类来协调视图和视图模型类的实例化很有用。这种方法可以与依赖注入容器一起使用,例如 MEF 或 Unity,或者当视图显式创建其所需的视图模型时。

对于我的模块,我将执行以下
操作为模块内的服务创建一个接口

public interface ICustomModuleUiService
{
    void ShowMainView();
    void ShowExtraView();
}

同一模块中的生产实现:

class CustomModuleUiService : ICustomModuleUiService
{
    private readonly IEventAggregator _eventAggregator;

    public CustomModuleUiService(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
    }

    public void ShowMainView()
    {
        var ddsViewModel = new DdsViewModel(_eventAggregator, this);
        DdsForm form = new DdsForm();
        form.DataContext = ddsViewModel;
        form.Show();
    }

    public void ShowExtraView()
    {
        //some code here
    }
}

最后是模块代码

[ModuleExport("DssModule", typeof(DssModuleImpl))]
public class DssModuleImpl : IModule
{
    private readonly IEventAggregator _eventAggregator;
    private ICustomModuleUiService _uiService;

    [ImportingConstructor]
    public DssModuleImpl(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _uiService = new CustomModuleUiService(_eventAggregator);
    }

    public void Initialize()
    {
        _eventAggregator.GetEvent<OpenDdsFormEvent>().Subscribe(param => _uiService.ShowMainView());
    }
}

使用这种方法我会得到

  • ViewModel 可以进行单元测试
  • 我可以通过替换 ICustomModuleUiService 的实现来动态更改对 OpenDdsFormEvent 的反应
于 2013-02-14T10:09:05.967 回答