【问题标题】:Why my Subscribe method is not called when using Prism EventAggregator?为什么在使用 Prism EventAggregator 时没有调用我的订阅方法?
【发布时间】:2019-06-23 06:05:39
【问题描述】:

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

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

update VM 内部运行ctor,但在Subscribe(UpdateName); 之后,UpdateName 未执行,原因我不明白。 p>

完整代码:

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&lt;UpdateNameEvent&gt;().Subscribe(UpdateName);

使用注入的eventAggregator订阅时,它不起作用:

_eventAggregator.GetEvent&lt;UpdateNameEvent&gt;().Subscribe(UpdateName);

EventAggregatorAutofac注册如下:

builder.RegisterType<EventAggregator>()
        .As<IEventAggregator>().SingleInstance();

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

【问题讨论】:

    标签: c# wpf mvvm prism autofac


    【解决方案1】:

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

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

    var bootStrapper = new BootStrapper();
    var container = bootStrapper.BootStrap();
    UpdateViewModel vm = container.Resolve<UpdateViewModel>();
    

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

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

    【讨论】:

    • 听起来很有趣。当我使用 Prism 时,我会尝试使用它的自动 VM 定位器...
    • 基于此解决方案:stackoverflow.com/questions/25366291/… 我创建了 VM 定位器并将 EventAggregator 解析为单音,并且它有效。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多