猿问

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

我正在学习棱镜。几个小时后我就遇到了一个问题,当订阅事件时,订阅方法没有被调用。我正在使用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;

        }

    }



白板的微信
浏览 98回答 1
1回答

一只萌萌小番薯

我不明白为什么这种依赖不起作用?因为您EventAggregator为 .创建了一个新的UpdateViewModel。var bootStrapper = new BootStrapper();var container = bootStrapper.BootStrap();UpdateViewModel vm = container.Resolve<UpdateViewModel>();这看起来好像为 新建了一个容器UpdateWindow,而新容器将有一个新的——也就是不同的—— EventAggregator。当然,这两者不会相互发送事件。所以解决方案是使用一个单一的容器来解决你所有的东西。这就是您使用 static 时发生的情况Utility。您应该避免使用这样的服务定位器。看一下ViewModelLocator,这使得为给定视图创建视图模型变得非常容易,例如,或者在创建容器时将容器传递给它UpdateWindow(虽然也有些丑陋)。
随时随地看视频慕课网APP
我要回答