为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的 Subscribe 方法在使用 Prism EventAggregator

为什么我的 Subscribe 方法在使用 Prism EventAggregator

C#
白板的微信 2023-04-29 09:58:14
我正在学习棱镜。几个小时后我就遇到了一个问题,当订阅事件时,订阅方法没有被调用。我正在使用Prism和Autofac。在下面的简化示例中,在MainViewModel Publish("dupa");事件中调用了ctor. 然后在按钮上单击UpdateWindow打开。在窗口的后端创建了UpdateViewModel的实例。内部更新 VM 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;        }    }
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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


因为您EventAggregator为 .创建了一个新的UpdateViewModel。


var bootStrapper = new BootStrapper();

var container = bootStrapper.BootStrap();

UpdateViewModel vm = container.Resolve<UpdateViewModel>();

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


所以解决方案是使用一个单一的容器来解决你所有的东西。这就是您使用 static 时发生的情况Utility。您应该避免使用这样的服务定位器。看一下ViewModelLocator,这使得为给定视图创建视图模型变得非常容易,例如,或者在创建容器时将容器传递给它UpdateWindow(虽然也有些丑陋)。


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信