用棱镜设置datacontext

时间:2013-02-14 07:53:18

标签: c# wpf dependency-injection prism unity-container

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

如果有可能,我不希望视图或虚拟对象彼此了解并希望使用类似

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

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

    EmployeeView.Datacontext = employeeViewModel;
}

我将在EmployeeModule中注册

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

2 个答案:

答案 0 :(得分:2)

您可以将ViewModel的界面传递给构造函数中的View。这样,View只知道ViewModelViewModel的界面对View一无所知。

实施例

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

有关MVVM实例化的多种方法,请参阅this blog post

答案 1 :(得分:1)

Prism documentation为您提供了一个选项

  

通常,您会发现定义控制器或服务类很有用   协调视图的实例化和查看模型类。   该方法可以与依赖注入容器一起使用   作为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的反应