使用事件时如何加载模块

时间:2018-11-10 08:18:19

标签: wpf prism prism-6

我是C#\ Prism生态系统中的新手。 我想通过事件连接模块,但是如果只是发送事件:

_eventAggregator.GetEvent<LoginSuccessEvent>().Publish(new LoginSuccessEventArgs(user));

然后我的事件处理程序不起作用。 据我了解,这是因为未创建接收者ViewModel(我在调试器中检查了断点)。 但是,如果我从事件发送者导航:

_regionManager.RequestNavigate(RegionNames.RootRegion, "WorksheetListView");
_regionManager.RequestNavigate(RegionNames.WorksheetDetailsRegion, "WorksheetDetailsView");
_eventAggregator.GetEvent<LoginSuccessEvent>().Publish(new LoginSuccessEventArgs(user));

然后在调用第一个RequestNavigate命令接收器ViewModel构造函数之前。

_regionManager = regionManager;
_model = container.Resolve<WorksheetListModel>();
OpenWorksheetCommand = new DelegateCommand(OpenWorksheet);
Worksheets = _model.WorksheetList;
eventAggregator.GetEvent<LoginSuccessEvent>().Subscribe(OnLoginSuccessEvent);

我试图将ViewModel类注册添加到接收者模块:

_container.RegisterType<WorksheetListViewModel>();

但是没有运气。我不想将此注册添加到发件人,因为已经建立了牢固的关系。

但是我想在modulel之间建立弱关系,并希望从RECIEVER(而不是SENDER)进行导航。因此,发件人对接收者一无所知。 我该如何实现? 谢谢。

2 个答案:

答案 0 :(得分:0)

尚不清楚您要实现的目标,但据我所知,您的问题是当前活着的那些实例存在事件。似乎您想要更多的状态,以便在用户登录后创建的视图模型可以检查用户是否登录并采取相应的措施。

我建议您创建一个服务来保留当前登录的用户并保留事件,因为它们可以很好地互补。

示例:

public interface IUserManager : INotifyPropertyChanged // this is optional if you keep the event
{
    // returns null if no user is logged in
    string CurrentUserName { get; }

    // returns true if user name and password are valid and updates CurrentUserName
    bool TryLogin( string userName, string password );
}

答案 1 :(得分:0)

好的。我发现了很多问题,例如(“ EventAggregator无法在模块周围工作”)。 我的解决方案非常简单。我创建了一个ViewModel实例,因此也调用了带有事件订阅的构造函数。

using Microsoft.Practices.Unity;
using Prism.Modularity;
using Prism.Regions;
using Prism.Events;
using Prism.Unity;

using WorksheetListModule.ViewModels;
using WorksheetListModule.Views;
using WorksheetListModule.Models;


namespace WorksheetListModule
{
    public class WorksheetListModule : IModule
    {
        IRegionManager _regionManager;
        IUnityContainer _container;
        IEventAggregator _eventAggregator;

        public WorksheetListModule(RegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator)
        {
            _regionManager = regionManager;
            _container = container;
            _eventAggregator = eventAggregator;
        }

        public void Initialize()
        {
            WorksheetListViewModel vm = new WorksheetListViewModel(_regionManager, _container, _eventAggregator);
            _container.RegisterInstance<WorksheetListViewModel>(vm);
            _container.RegisterType<WorksheetListModel>();
            _container.RegisterTypeForNavigation<WorksheetListView>();
            _container.RegisterTypeForNavigation<WorksheetDetailsView>();
        }
    }
}

这里的主要功能是RegisterInstance函数。 因此,现在我可以在事件接收者中进行导航了,事件发送者现在不知道有关接收者内部结构的任何信息。