gpt4 book ai didi

c# - 为什么在使用 Prism EventAggregator 时没有调用我的订阅方法?

转载 作者:行者123 更新时间:2023-12-03 10:31:53 25 4
gpt4 key购买 nike

我正在学习 Prism 。几个小时我就遇到了一个问题,订阅事件时,订阅方法没有被调用。我正在使用 Prism Autofac .

在下面的简化示例中,主视图型号 Publish("dupa");事件在 ctor 中调用.在按钮上单击 更新窗口 被打开。在窗口的后端创建 的实例更新 View 模型 .

内部更新虚拟机 ctor已运行,但在 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;
}
}

更新

经过调查,我注意到,当订阅这样的事件时,它工作正常:
Utility.EventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
使用已注入(inject) 订阅时事件聚合器 , 这没用:
_eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);
事件聚合器 注册Autofac 如下:
builder.RegisterType<EventAggregator>()
.As<IEventAggregator>().SingleInstance();

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

最佳答案

I do not understand why this dependency does not work?



因为你创建了一个新的 EventAggregator对于 UpdateViewModel .
var bootStrapper = new BootStrapper();
var container = bootStrapper.BootStrap();
UpdateViewModel vm = container.Resolve<UpdateViewModel>();

这看起来好像为 UpdateWindow 创建了一个新容器。 ,而新容器将有一个新的——即不同的—— EventAggregator .当然,这两个不会互相发送事件。

所以解决方案是使用一个容器来解决你所有的东西。当您使用静态 Utility 时会发生这种情况。 .您应该避免使用这样的服务定位器。看看 ViewModelLocator ,这使得为给定 View 创建 View 模型变得非常容易,例如,或者将容器传递给 UpdateWindow当它被创建时(虽然也有点丑陋)。

关于c# - 为什么在使用 Prism EventAggregator 时没有调用我的订阅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56721450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com