我正在学习棱镜。我已经面临几个小时的问题,订阅该事件时,未调用订阅方法。我正在使用 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);
我不明白为什么这种依赖性不起作用?
答案 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
(也有点丑陋,虽然)。