Итак, я пытаюсь использовать общие переменные в своем приложении 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
, но я не вижу способа его создания без конструктора. Могу я все об этом сказать неправильно?