Почему моя строка event.Subscribe () возвращает нулевую ссылку? - PullRequest
0 голосов
/ 16 апреля 2019

Я изучаю WPF с Caliburn Micro.Я прочитал документацию много раз, и я даже следую учебному пособию на YouTube от Timcorey.Где-то вдоль линии я, должно быть, не указал / инициализировал что-то правильно.

Обычно я бы указывал объект как X obj = new X ();но в этом случае Eventaggregator это не нравится.Мне удалось заставить код работать, изменив строку events.subscribe на:

if (_events != null) _events.Subscribe(this)

, но во время выполнения код никогда не достигает этой строки, даже когда установлена ​​точка останова.После удаления всего кода Eventaggregator я могу запускать и запускать свои события.Я просто не могу опубликовать и подписаться на него.

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PropertyChanged;
using Caliburn.Micro;

using ERP101.EventModels;
using ERP101.ViewModels;

namespace ERP101.ViewModels
{
    [AddINotifyPropertyChangedInterface]
    public class ShellViewModel : Conductor<object>,IHandle<LoginEvent>
    {
        private IEventAggregator _events;
        private StartPageViewModel _startPVM;
        private SimpleContainer _container;

        public ShellViewModel(IEventAggregator events,StartPageViewModel startPVM,SimpleContainer container)
        {
            _events = events;
            _events.Subscribe(this); //null reference error here
            _startPVM = startPVM;
            _container = container;

             ActivateItem(_container.GetInstance<LoginViewModel>());

        }

        public void Handle(LoginEvent message)
        {
            ActivateItem(_startPVM);
        }
    }
}```

1 Ответ

0 голосов
/ 17 апреля 2019

Спасибо, Эми, поэтому я снова вернулся к учебникам и обнаружил свою проблему в коде контейнера.


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

            GetType().Assembly.GetTypes()
                .Where(type => type.IsClass)
                .Where(type => type.Name.EndsWith("ViewModel"))
                .ToList()
                .ForEach(viewModelType => _container.RegisterPerRequest(viewModelType, viewModelType.ToString(), viewModelType));
        }

.Singleton<EventAggregator, EventAggregator>(); - эта строка неверна, исправленная строка в коде выше. Первый должен был быть интерфейсным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...