问题 Caliburn.Micro事件汇总器

德威B76

新成员
已加入
2018年1月29日
留言内容
1
编程经验
Beginner
我正在尝试学习如何将数据从SecondWindowViewModel传递回ShellViewModel。我想要通过事件聚合器使用消息传递。我试图使它在我的主要项目上正常工作,所以我创建了一个非常简单的程序。这"ShellViewModel"有一个文本框和一个按钮,当您单击该按钮时,将打开另一个窗口,第二个窗口有一个按钮和一个文本框。当用户在文本框中键入内容并单击按钮时,程序将被设置为将文本发送回显示该文本的主窗口。我的程序在此处公开发布:

//github.com/Dev-Mech/CaliburnMicro.git

现在,当我单击按钮时,我得到一个"null reference"错误。我相信"_eventAggregator"该行未创建对象。


C#:
_eventAggregator.PublishOnCurrentThread(Tosend);

我已经确认了我所有的数据绑定工作。我使用自定义POCO作为消息,因为在我的主程序中,我将发回一个对象,而不仅仅是简单的文本。我遵循了一些教程,所有教程都说不同的话,但都无法正常工作。我制作的简单程序是基于本教程的-直接来自Caliburn Micro的站点:

//caliburnmicro.com/documentation/event-aggregator

如果有人可以帮助我,我将非常感激。我似乎找不到很多文档!

"AppBootstrapper"
C#:
namespace CaliburnMicro{
    class AppBootstrapper : BootstrapperBase
    {
        private readonly SimpleContainer _container = new SimpleContainer();


        public AppBootstrapper()
        {
            Initialize();
        }


        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<ShellViewModel>();
        }


        protected override void Configure()
        {
            _container.Singleton<IEventAggregator, EventAggregator>();
        }
    }
}

"ShellViewModel"

C#:
namespace CaliburnMicro.ViewModels{
    class ShellViewModel : Screen, IHandle<EventMessage>
    {
        private string _messageBox;
        private readonly IEventAggregator _eventAggregator;




        public string MessageBox
        {
            get { return _messageBox; }
            set
            {
                _messageBox = value;
                NotifyOfPropertyChange(() => MessageBox);
            }
        }


        public ShellViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            _eventAggregator.Subscribe(this);
        }


        public ShellViewModel()
        {


        }


        public void OpenWindow()
        {
            WindowManager wm = new WindowManager();
            SecondWindowViewModel swm = new SecondWindowViewModel(_eventAggregator);
            wm.ShowWindow(swm);
        }


        public void Handle(EventMessage message)
        {
            MessageBox = message.Text;
        }
    }
}

"SecondWindowViewModel"
C#:
namespace CaliburnMicro.ViewModels{
    class SecondWindowViewModel: Screen
    {


        private string _secondTextBox;
        private readonly IEventAggregator _eventAggregator;
        public string SecondTextBox
        {
            get { return _secondTextBox; }
            set
            {
                _secondTextBox = value;
                NotifyOfPropertyChange(() => SecondTextBox);
            }
        }
        




        public SecondWindowViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
        }


        public void SendBack()
        {
            EventMessage Tosend = new EventMessage();
            Tosend.Text = SecondTextBox;
            _eventAggregator.PublishOnCurrentThread(Tosend);
            Thread.Sleep(1000); //I wanted the app to wait a second before closing
            TryClose();
        }


    }
}
 
最佳 底部