【问题标题】:WPF, 'Object reference not set to an instance of an object' in DesignerWPF,设计器中的“对象引用未设置为对象的实例”
【发布时间】:2012-04-22 10:33:13
【问题描述】:

当我尝试为我的 XAML UserControl 重新加载设计器时,我收到“对象引用未设置为对象的实例”错误。 Visual Studio 突出显示以下行作为问题:

<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
    Width="600" TemplateData="{Binding ElementName=cbo_templates,
                               Path=SelectedItem.Data, Mode=OneWay}"/>

TemplateDetail 是另一个UserControl。当我查看TemplateDetail 时,它的设计器视图加载得很好,所以我认为那里没有问题。在我的 XAML 中有一个名为 cbo_templatesComboBox,其中包含我的 Template 类的实例,该类具有 Data 属性(因此是 SelectedItem.Data)。但是,如果我从上述 XAML 中的 Path 中删除 .Data,我仍然会收到“对象引用”错误,所以我认为问题不在于我正在尝试访问 Path 上的属性null。这是我的ComboBox XAML,以防万一:

<ComboBox ItemsSource="{Binding Path=List}" Grid.Row="1" Grid.Column="3"
          VerticalAlignment="Center" x:Name="cbo_templates" Width="250"
          HorizontalAlignment="Left" DisplayMemberPath="Name"
          SelectedValuePath="Name" SelectedIndex="0"/>

出现此错误是一个真正的问题,因为无法加载设计视图,所以如果不运行应用程序,我看不到我的 UserControl 的样子。知道有什么问题吗?它构建良好,我在构建输出中看不到任何绑定问题。

编辑:这是UserControls 的构造函数代码:

UserControl 的构造函数出现“对象引用”错误:

InitializeComponent();
grd_templateList.DataContext = this; // refers to containing <Grid> in XAML

UserControl 的构造函数我正在尝试嵌入,其设计视图加载正常:

InitializeComponent();
grd_templateDetail.DataContext = this; // refers to containing <Grid> in XAML

编辑:我尝试在构造函数中设置 DataContext 属性之前检查 if (null != grd_templateList),但这并没有帮助 - 重新加载时仍然出现“对象引用”错误设计师。

编辑:ComboBox 使用的List 属性是DependencyProperty。我在Register 方法中设置了默认值:

public static readonly DependencyProperty ListProperty =
    DependencyProperty.Register(
        "List",
        typeof(List<Template>),
        typeof(TemplateList),
        new PropertyMetadata(
            new List<Template> { _defaultTemplate }
        )
    );

即使我尝试在我的UserControl 的构造函数中初始化List,在重新加载设计器时我仍然会收到错误消息。我认为问题不在于 List 为 null 或 SelectedItem.Data 是错误路径。

编辑:好的,即使只是这样做也会导致我的设计器无法加载,从而出现“对象引用”错误:

<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
                      TemplateData="{Binding}"/>

显然,它不喜欢 TemplateData 属性被绑定。

编辑:更神秘的是,我可以查看我的整体/主要Window 的设计视图,其中包括UserControl,其设计视图给了我“对象引用”错误. O_o

【问题讨论】:

  • 两个用户控件的构造函数中是否有代码?
  • @Goblin:更新了我的问题以显示构造函数代码。

标签: .net wpf visual-studio-2010 xaml


【解决方案1】:

What Alex says 是要走的路。但我觉得理解他在说什么有点令人困惑。

假设您在 Visual Studio 中打开了项目,请打开另一个 Visual Studio 实例并选择 Debug->Attach To Process。在打开的对话框中选择

  • XDesProc.exe(即 XAML UI 设计器)适用于 VS2012 及更新版本
  • devenv.exe 用于旧 VS 版本。

然后为用户控件执行“重新加载设计器”并查看第二个 VS 实例中的输出以检查究竟是什么错误。

【讨论】:

  • 感谢您的澄清。我尝试了这个,但在第二个 VS 窗口(我选择附加到进程的那个窗口)中没有显示任何内容。我在我的第一个 VS 窗口中点击了 Reload Designer,它在错误列表中显示了相同的“对象引用”错误,但从未弹出到第二个 VS 窗口。有没有办法在 XAML 中设置断点?
  • 其实我之前没有看到你的xaml。我认为问题出在 SelectedItem.Data 上。 SelectedItem 为空,您在其上引用数据。哈哈,现在我读了你的文字。对不起!!!
  • @NVM:我不知道,即使我删除了Binding 中的所有内容,只显示Binding ElementName=cbo_templates,我也会收到错误消息。
  • 好的,在一些非常罕见的情况下,我发现当第二个 VS 实例没有显示任何内容时。在VS中重启项目神奇地解决了这个问题。不过,这是在黑暗中拍摄的。
  • @NVM:退出 VS,打开两个实例,附加到第一个实例,在第一个中打开我的项目,然后重新加载设计器仍然不会将我弹出到第二个 VS 或显示任何内容都在第二个VS中。 :( 如果重要的话,我正在使用 VS 2010。
【解决方案2】:

如果您在 XAML 中设置了“未将对象引用设置为对象的实例”,但您的应用程序编译并运行良好,您通常会发现其原因是构造函数中无法在设计时解决的问题时间。

虽然您可以借助此问题的其他答案找出问题的根源,但有时这是您无法简单解决的问题,您需要在代码中完全按照您的方式使用它,但您不需要不想看到这个错误。

在这种情况下,只需单击位于设计器视图底部的“禁用项目代码”按钮,Visual Studio 设计器将停止尝试构造实例以提供设计时数据视图。

有关详细信息,请参阅here

【讨论】:

    【解决方案3】:

    这可能是您的用户控件的构造函数中的某些内容。 VS2008 WPF 设计器似乎对此有一些问题。

    在我们接手的一个项目中,我们添加了:

    if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
    {
        return;
    }
    

    到用户控件的构造函数的开头,发生这种情况以避免该错误。

    【讨论】:

      【解决方案4】:

      如果您的用户控件在设计时抛出异常,您可以对其进行调试。为此,请在 Visual Studio 中使用此用户控件打开 Dll 项目。选择另一个 Visual Studio 实例作为调试的可执行文件。开始调试。在第二个(已调试)Visual Studio 实例中,使用客户端 XAML 页面中的用户控件。这样就可以在设计模式下调试用户控件了。

      【讨论】:

      • select another Visual Studio instance as executable for debugging,您的意思是“附加到进程”吗?
      • 您可以使用附加到进程,或打开项目属性、调试、调试会话的可执行文件,并使用启动 Visual Studio 的命令填充命令行。然后执行“开始调试”命令。另一个 VS 实例启动。在这种情况下,请在客户端表单或 XAML 页面上使用用户控件。
      • NVM 下面解释了如何执行此操作,但正如我在 cmets 中所说,我无法让 VS 2010 的第二个实例显示有关“对象引用”错误的任何错误消息。
      • 你的意思是,在独立的 Visual Studio 实例中你会得到异常,而在调试器实例中它不会被复制?只需在调试实例中执行与在独立实例中相同的操作即可。您还可以将 Trace.WriteLine 调用添加到控制代码,在使用它们之前测试 NULL 不同的对象。使用 DbgView 程序捕获此输出。
      【解决方案5】:

      这个帖子有点老了,但我有一个问题我刚刚在它的帮助下解决了,所以我可以稍微澄清一些观点。

      1. 像往常一样在 Visual Studio 中加载您的解决方案。
      2. 打开 VS 的第二个实例,菜单调试/附加到处理/选择 devenv。 你应该看不到任何壮观的东西!在 VS 2010 中,我得到了 “运行模式下无法显示反汇编。”
      3. 返回到您的第一个实例,您的解决方案在此打开。加载或重新加载有问题的 XAML 文件。如果你有问题(我在用户控件上有一个异常,所以我无法加载那个窗口),调试器应该在第二个实例中指向有问题的代码。就我而言,这是非常 清晰明了。

      为了防止有问题的代码在设计时运行,我使用了

          If System.ComponentModel.LicenseUsageMode.Runtime = 1 Then
              myObject = New ObjectDefinition
          End If
      

      效果很好。

      【讨论】:

        【解决方案6】:

        在用于 WPF 的 Visual Studio 2015 中:

        1. 将鼠标悬停在设计视图中的“对象引用未设置为对象的实例”上。
        2. 等待(几)秒,您将看到一个弹出窗口
        3. 选择“查看异常详细信息”(您还将看到“查看代码”和“删除此元素”
        4. 此对话框将向您显示异常和 StackTrace

        希望这会有所帮助。

        如果您在 XAML 上执行此操作,您只会看到异常,但看不到带有“查看异常详细信息”的弹出窗口,因此您需要在设计器/设计视图中执行此操作。

        【讨论】:

        • 当我将鼠标悬停在它上面时没有任何反应 - 我只是得到工具提示
        【解决方案7】:

        在给对象命名后,我能够解决问题。它是 VS2015,我的标记不同,但它也可以帮助某人:

        <ResourceDictionary>
            <DataTemplate x:Key="ThisKeySolvesDesignersNullRef" 
                            DataType="local:MyViewModel">
                <local:MyControl/>
            </DataTemplate>
        </ResourceDictionary>
        

        【讨论】:

          【解决方案8】:

          在我的 UWP 代码中编辑了大量 XAML 后,我今天遇到了这个错误,我不知道出了什么问题......但经过仔细检查后,我注意到我犯了这个错误:

          <Button Click="{Binding MyCommand}" />
          

          我错误地将我的命令分配给了 Click 处理程序,这导致了一个空引用异常...在将 Click 更改为 Command 后,错误消失了。

          XAML 错误报告需要改进!

          【讨论】:

            猜你喜欢
            • 2014-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多