【问题标题】:WPF - Linq moved to constructor is causing null reference exception, how come?WPF - Linq 移到构造函数导致空引用异常,怎么会?
【发布时间】:2009-11-02 16:22:53
【问题描述】:

已经清楚地将代码从我的 Page_Loaded 方法移动到构造函数(请参阅HERE),我现在在我的 Linq 到实体查询中遇到错误。它现在导致 nullreferenceexception,我现在不知道为什么。异常位置见下文。

public Building()
{
    InitializeComponent();

    lvBuildings.ItemsSource = App.ocBuildings;
    getBuildings();
}


private void Page_Loaded(object sender, RoutedEventArgs e)
{

}

private void getBuildings()
{
    App.ocBuildings.Clear();
    var tehBuildings = from building in App.ents.Buildings
                       where building.Organisations.OrganisationID == App.selectedOrganisation.OrganisationID
                       select building;

    foreach (Buildings addBuilding in tehBuildings (<--Exception))
    {
        App.ocBuildings.Add(addBuilding);
    }

}

有人有什么想法吗?

谢谢, 可汗。

【问题讨论】:

  • 您是否尝试过启用“抛出异常时中断”来调试您的代码?
  • 发布完整的堆栈跟踪会有所帮助。
  • 出于好奇,为什么要将这段代码移出 Loaded 事件处理程序?
  • 我只希望代码在第一次创建页面时运行,如果我将它保存在 page_Loaded 中,代码将重新运行并在我通过导航返回时导致问题。

标签: c# wpf linq constructor


【解决方案1】:

看起来以下项目之一正在评估为 null

  • App.ents
  • App.ents.Buildings
  • 建筑.组织
  • App.SelectedOrganisation

这将导致在 for each 循环中抛出NullReferenceException,因为在使用之前不会实际评估查询。

我们需要您提供更多关于哪个为空的信息。

【讨论】:

  • 看起来 App.selectedOrganisation 为空。为什么将此代码从 Page_Loaded(它工作正常)移动到构造函数会导致它中断?
  • @Kohan,可能是在构造函数和 Page_Loaded 事件之间运行的其他代码导致该值不为空。我没有足够的背景了解您的项目,但无法负责任地说出什么。
  • Page_Loaded 在页面加载后触发。 App.selectedOrganization 几乎可以肯定是对绑定结果的引用。在页面加载之前没有发生绑定。
【解决方案2】:

@JaredPar.

感谢您的修复,我从没想过要查看我的客户端中的上一页(我从中加载)以获得答案。

我有一个带有代码的按钮:

        Page newPage;
        if (App.ModeType == "Mode1"){ newPage = new MyClient.Pages.Mode1.Building(); }
        else if (App.ModeType == "Mode2") { newPage = new MyClient.Pages.Mode2.RiskQuestions(); }
        else { throw new NotImplementedException(); } ///Must be Mode3

            Organisations thisOrg = (Organisations)lvOrganisations.SelectedItem;
        App.selectedOrganisation = thisOrg;

        NavigationService.Navigate(newPage);

通过将 App.selectedOrganisation 移动到我设置“newPage”之前,一切都已修复。我想构造函数在我设置“newPage”时被调用。

为了清楚起见,对我有用的最终代码如下所示:

            Organisations thisOrg = (Organisations)lvOrganisations.SelectedItem;
        App.selectedOrganisation = thisOrg;

        Page newPage;
        if (App.ModeType == "Mode1"){ newPage = new MyClient.Pages.Mode1.Building(); }
        else if (App.ModeType == "Mode2") { newPage = new MyClient.Pages.Mode2.RiskQuestions(); }
        else { throw new NotImplementedException(); } ///Must be Mode3

        NavigationService.Navigate(newPage);

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多