gpt4 book ai didi

c# - 运行MVVM时,EventHandler为Null

转载 作者:行者123 更新时间:2023-12-03 10:32:42 25 4
gpt4 key购买 nike

因此,我试图在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");
}
}

}

我正在菜单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,但是我没有找到一种无需构造函数即可实例化它的方法。我能解决所有这些错误吗?

最佳答案

这里的问题是您要强制调用UniverseChanged事件,但是没有监听器来处理它,因此该事件实际上可以为null。

调用之前,应检查是否有监听器。像这样:

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");
}
}

希望对您有所帮助。

关于c# - 运行MVVM时,EventHandler为Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50201102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com