为什么在使用Prism EventAggregator时未调用我的Subscribe方法?

时间:2019-06-23 06:05:39

标签: c# wpf mvvm prism autofac

我正在学习棱镜。我已经面临几个小时的问题,订阅该事件时,未调用订阅方法。我正在使用 Prism Autofac

在下面的简化示例中,在 MainViewModel 中,Board中的事件Publish("dupa");被调用。然后在按钮上单击 UpdateWindow 。在窗口的后端创建 UpdateViewModel 的实例。

更新VM 内部运行了ctor,但是在ctor之后,由于某些原因我没有执行 UpdateName 了解。

完整代码:

Subscribe(UpdateName);

更新

在调查之后,我注意到,订阅这样的事件,效果很好:

public class MainViewModel : ViewModelBase { private IEventAggregator _eventAggregator; public MainViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; //Prism _eventAggregator.GetEvent<UpdateNameEvent>().Publish("dupa"); OnOpenCommand = new DelegateCommand(OnOpenWin); } public void OnOpenWin(object obj) { UpdateWindow win = new UpdateWindow(); win.Show(); } public ICommand OnOpenCommand { get; private set; } } public class UpdateViewModel : ViewModelBase { private IEventAggregator _eventAggregator; public UpdateViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; //Prism _eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName); } private void UpdateName(string name) { this.Name = name; //is not called at all } private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } } public partial class UpdateWindow : Window { public UpdateWindow() { var bootStrapper = new BootStrapper(); var container = bootStrapper.BootStrap(); UpdateViewModel vm = container.Resolve<UpdateViewModel>(); InitializeComponent(); DataContext = vm; } }

订阅使用已注入的 eventAggregator 时,该方法不起作用:

Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);

EventAggregator Autofac 注册,如下所示:

_eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);

我不明白为什么这种依赖性不起作用?

1 个答案:

答案 0 :(得分:2)

  

我不明白为什么这种依赖性不起作用?

因为您为@{Jodie Stockham=Jason Dickson} @{Jodie Stockham=Dwayne Bartlett-Kennedy} @{Jodie Stockham=Mark Lamprey} @{Jodie Stockham=Anthony Triggs} @{Jodie Stockham=Allan Hood} 创建了一个新的EventAggregator

UpdateViewModel

这似乎为var bootStrapper = new BootStrapper(); var container = bootStrapper.BootStrap(); UpdateViewModel vm = container.Resolve<UpdateViewModel>(); 创建了一个新容器,并且该新容器将有一个新的-即另一个-UpdateWindow。这两个当然不会互相发送事件。

因此解决方案是使用一个容器来解决您的所有问题。这是使用静态EventAggregator时发生的情况。您应该避免使用这样的服务定位器。看一下Utility,例如,它可以非常轻松地为给定视图创建视图模型,或者在创建容器时将其传递给ViewModelLocator(也有点丑陋,虽然)。