我正在尝试使用PRISM创建一个模块,现在我在View中设置了DataContext,这意味着我只能使用一个Parameterless构造函数,但这意味着我不能在构造函数中使用依赖注入(我使用Unity)想要
如果有可能,我不希望视图或虚拟对象彼此了解并希望使用类似
的内容private void RegisterServices()
{
var employeeViewModel = new EmployeeViewModel();
_container.RegisterType<IEmployeeViewModel, EmployeeViewModel>();
_container.RegisterType<EmployeeView>();
EmployeeView.Datacontext = employeeViewModel;
}
我将在EmployeeModule中注册
这可能还是我应该使用代码?
答案 0 :(得分:2)
您可以将ViewModel
的界面传递给构造函数中的View
。这样,View
只知道ViewModel
和ViewModel
的界面对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());
}
}
使用这种方法我会得到