在我的解决方案中,我也使用Autofac和Prism。下面是一个简化的项目,解释了会发生什么。我正在注册我的视图、视图模型和Autofac的容器类EventAggregator:public class BootStrapper { public IContainer BootStrap() { var builder = new ContainerBuilder(); builder.RegisterType<EventAggregator>() .As<IEventAggregator>().SingleInstance(); builder.RegisterType<MainWindow>().AsSelf(); builder.RegisterType<ChildView1>().AsSelf(); builder.RegisterType<MainViewModel>().AsSelf(); builder.RegisterType<Child1ViewModel>().AsSelf(); return builder.Build(); } }请注意,将视图模型注册为单例时,效果是相同的。我EventAggregator像这样注入我的虚拟机:public class MainViewModel { private IEventAggregator _eventAggregator; public MainViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; UpdateName("Name1"); } public void UpdateName(string name) { ChildView1 win1 = new ChildView1(); //in the backend Child1ViewModel is assigend to its DataContext win1.Show(); _eventAggregator.GetEvent<UpdateNameEvent>().Publish(name); //this does not work } }上面的代码不起作用。因为某些原因(希望大家告诉我原因),在执行UpdateName方法时,这个依赖不起作用,Child1ViewModel类内部的UpdateName方法没有被执行:public class Child1ViewModel : ViewModelBase { private IEventAggregator _eventAggregator; public Child1ViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; _eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName); } private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } }
1 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
我假设您正在使用 Prism 的 ViewModelLocator 机制。我的假设是基于您手动实例化ChildView1而不是使用依赖注入容器解析它,并在评论中声明 viewModel 在后台解析。
您必须更改用于解析 ViewModel 实例的 Prism ViewModelLocator 容器,如下所示。
ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType) =>
{
return YourAutofacContainer.Resolve<viewModelType>();
});
请记住,为了在整个应用程序中保持对象实例的单实例生命周期范围一致,您必须使用相同的依赖注入容器实例来解析对象和此对象的父对象,一直到根对象。
- 1 回答
- 0 关注
- 228 浏览
添加回答
举报
0/150
提交
取消