使用Unity和prism EventAggregator将数据从一个VM传递到另一个VM

时间:2016-04-15 14:30:10

标签: c# wpf mvvm dependency-injection prism

尝试使用prism EventAggregator将数据从一个ViewModel传递到另一个ViewModel,但是当我在订阅服务器上调试时,数据为空。

使用棱镜5.0版。

更新

好的,我尝试使用prism 5.0版本实现EventAggregator。它仍然没有工作,但这就是我所做的。

1:创建活动类

public class RoomsSelectedEvent : PubSubEvent<ObservableCollection<Room>>
{

} 

2:在发布商ViewModel(BookingViewModel)上注入IEventAggregator

public class BookingViewModel : INotifyPropertyChanged, IViewBookingViewModel
{
    //aggregator 
    protected readonly IEventAggregator _eventAggregator;

    //commands
    public ICommand ContinueCommand { get; set; }

    public ObservableCollection<Room> RoomsList { get; private set; }        
    public ObservableCollection<RoomList> DropDownRooms { get; private set; }
    public ObservableCollection<CustomerList> DropDownCustomers { get; private set; }

    //enities
    private readonly IDialogService<ContactDetailsView> _dialogServiceContactView;
    private readonly IGetRoomsService _getRoomsService;

    public BookingViewModel(IDialogService<ContactDetailsView> dialogServiceContactview, IGetRoomsService GetRoomsService, IEventAggregator eventAggregator)
    {
        // Injection
        _dialogServiceContactView = dialogServiceContactview;
        _getRoomsService = GetRoomsService;
        _eventAggregator = eventAggregator;

        //commands
        ContinueCommand = new RelayCommand(ContinueCommand_DoWork, () => true);

    }

    // Continue Command
    public void ContinueCommand_DoWork(object obj)
    {
        ObservableCollection<Room> RoomsSelected = new ObservableCollection<Room>();

        RoomsSelected = _getRoomsService.FilterSelectedRooms(RoomsList);

        //Publish event:
        _eventAggregator.GetEvent<RoomsSelectedEvent>().Publish(RoomsSelected);

        // Open new dialog
        _dialogServiceContactView.ShowDialog();
    }

}

3:在订阅者viewModel(ContactViewModel)中注入IEventAggregator

public class ContactViewModel : IViewContactViewModel, INotifyPropertyChanged
{
    //aggregator 
    protected readonly IEventAggregator _eventAggregator;

    //properties
    public ObservableCollection<Room> SelectedRooms { get; set; }

    public ContactViewModel(IEventAggregator eventAggregator)
    {
        //Injection
        _eventAggregator = eventAggregator;

        //Subscripe to event
        _eventAggregator.GetEvent<RoomsSelectedEvent>()
        .Subscribe((data) => { SelectedRooms = data; });
    }

    public ObservableCollection<Room> Rooms
    {
        get { return SelectedRooms; }
        set { SelectedRooms = value; NotifyPropertyChanged(); }
    }

}

我读过它可能是因为IEventAggregator在两个ViewModels中都不一样。我使用Unity像这段代码一样注入它:

protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        //view & viewModels
        _container = new UnityContainer();
        _container.RegisterType<IViewMainWindowViewModel, MainWindow>();
        _container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
        _container.RegisterType<IViewBookingViewModel, BookingView>();
        _container.RegisterType<IViewBookingViewModel, BookingViewModel>();
        _container.RegisterType<IViewContactViewModel, ContactDetailsView>();
        _container.RegisterType<IViewContactViewModel, ContactViewModel>();
        _container.RegisterType<IGetRoomsService, GetRoomsService>();
        _container.RegisterType<IPostReservationService, PostReservationService>();
        _container.RegisterType<IGetReservationsListService, GetReservationsListService>();

        //types
         _container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
        _container.RegisterType(typeof(IDialogService<>), typeof(DialogService<>));

        _container.Resolve<MainWindow>().Show();
    }

发现我需要添加ContainerControlledLifetimeManager,但它仍然无法正常工作。

当我在订阅者viewModel中调试时,我可以看到实例中有一个事件,就像在图像上一样:

Debug of subscriber

它不会抓住它,这就是问题所在:(

今天我尝试删除我安装的所有软件包(prism 5.0)并转到Prism.Core(6.1版本)

结果相同,我可以看到我在发布时调试该事件,但是当我订阅时,它仍然是空的。

0 个答案:

没有答案