EventHandler равен Null при работе MVVM - PullRequest
0 голосов
/ 06 мая 2018

Итак, я пытаюсь использовать общие переменные в своем приложении WPF. При этом я реализовал класс ViewModelController для хранения переменных, которые влияют на остальную часть моего приложения, используя eventhandler.

Мой ViewModelController класс таков:

    public class ViewModelController
    {

        private DataRowView _SelectedUniverse;

        public MenuViewModel MenuViewModel { get { return new MenuViewModel(this); } }

        public GamePageViewModel GamePageViewModel { get { return new GamePageViewModel(this); } }

        public PlayersViewModel PlayersViewModel { get { return new PlayersViewModel(this); } }

        public event EventHandler UniverseChanged;

        public DataRowView SelectedUniverse
        {
            get { return _SelectedUniverse; }
            set
            {
                _SelectedUniverse = value;
                UniverseChanged.Invoke(this, EventArgs.Empty);
                Debug.Print("Universe Changed in ViewModelController");
            }
        }

    }

Я тестирую это в моей Menu ViewModel, чтобы проверить, переходит ли это к другому классу:

MenuViewModel

    public class MenuViewModel : ObservableObject
    {

        ViewModelController _ViewModelController;
        private DataView _Universes;
        private DataRowView _SelectedUniverse;

        public MenuViewModel(ViewModelController controller)
        {
            _ViewModelController = controller;
            _Universes = Controller.UniverseTableAdapter.GetData().DefaultView;
        }

        public DataView Universes
        {
            get { return _Universes; }
            set
            {
                _Universes = value;
                RaisePropertyChangedEvent("Universes");
            }
        }

        public DataRowView SelectedUniverse
        {
            get { return _SelectedUniverse; }
            set
            {
                _SelectedUniverse = value;
                Debug.Print("Universe Changed from Menu");
                _ViewModelController.SelectedUniverse = _SelectedUniverse;
                RaisePropertyChangedEvent("SelectedUniverse");
            }
        }
    }

PlayerViewModel Класс

public class PlayersViewModel : ObservableObject
{

    private ViewModelController _ViewModelController;

    #region Variables
    private ObservableCollection<Player> _Players = Controller.GetPlayers(0);
    private Player _SelectedPlayer;
    private DataView _Colleges = Controller.CollegeTableAdapter.GetData().DefaultView;
    private DataView _Universes = Controller.UniverseTableAdapter.GetData().DefaultView;

    private long _PlayerID;
    private string _PlayerFirstName;
    private string _PlayerLastName;
    private string _PlayerFullName;
    private DataRowView _SelectedCollege;
    private DataRowView _SelectedUniverse;
    private long _PlayerCollegeID;
    private long _UniverseID;
    private int _PlayerEnteredYear;

    private DataView _RegularSeasonStats = Controller.SeasonView.GetData().DefaultView;
    private DataRowView _SelectedSeason;
    private DataView _PlayoffStats = Controller.PlayoffsView.GetData().DefaultView;
    private DataView _PlayerSchedule = Controller.PlayerScheduleView.GetDataByPersonAndYear(0, 0).DefaultView;
    #endregion 

    public PlayersViewModel(ViewModelController controller)
    {
        _ViewModelController = controller;
        _ViewModelController.UniverseChanged += OnUniverseChanged;
        Debug.Print("PlayerViewModel Constructed");
    }

    public DataRowView SelectedUniverse
    {
        get { return _SelectedUniverse; }
        set
        {
            _SelectedUniverse = value;
            if(_SelectedUniverse != null)
            {
                _UniverseID = _SelectedUniverse.Row.Field<long>("UniverseID");
                RaisePropertyChangedEvent("SelectedUniverse");
            }
        }
    }

    private void OnUniverseChanged(object sender, EventArgs e)
    {
        SelectedUniverse = _ViewModelController.SelectedUniverse;
        Debug.Print("Universe was changed");
    }
}

При изменении SelectedUniverse эта переменная отправляется в ViewModelController, что должно вызвать событие UniverseChanged. Тем не менее, я получаю Object Reference Not Set to an Instance of an Object.

Я знаю, что должен создать экземпляр EventHandler, но я не вижу способа его создания без конструктора. Могу я все об этом сказать неправильно?

1 Ответ

0 голосов
/ 06 мая 2018

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

Вы должны проверить, есть ли слушатели перед вызовом. Как это:

public DataRowView SelectedUniverse
{
    get { return _SelectedUniverse; }
    set
    {
        _SelectedUniverse = value;
        UniverseChanged?.Invoke(this, EventArgs.Empty);
        // Or if you're using a C# version< 6:
        // var evtHandlers = UniverseChanged;
        // if(evtHandlers != null) evtHandlers.Invoke(this, EventArgs.Empty);
        Debug.Print("Universe Changed in ViewModelController");
    }
}

Надеюсь, это поможет.

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