WPF,'对象引用未在Designer中设置为对象的实例'

Sar*_*els 30 .net wpf xaml visual-studio-2010

当我尝试为我的XAML重新加载Designer时,我得到一个"对象引用没有设置为对象的实例"错误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}"/>
Run Code Online (Sandbox Code Playgroud)

TemplateDetail是另一个UserControl.当我查看时TemplateDetail,它的Designer视图加载得很好,所以我认为那里没有问题.ComboBox我的XAML中有一个命名cbo_templates包含我的Template类的实例,它有一个Data属性(因此SelectedItem.Data).但是,如果我.DataPath上面的XAML中删除,我仍然得到"对象引用"错误,所以我不认为问题是我正在尝试访问该Path属性null.这是我的ComboBoxXAML以防万一:

<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"/>
Run Code Online (Sandbox Code Playgroud)

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

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

UserControl带有"对象引用"错误的构造函数:

InitializeComponent();
grd_templateList.DataContext = this; // refers to containing <Grid> in XAML
Run Code Online (Sandbox Code Playgroud)

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

InitializeComponent();
grd_templateDetail.DataContext = this; // refers to containing <Grid> in XAML
Run Code Online (Sandbox Code Playgroud)

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

编辑:使用List属性ComboBoxDependencyProperty.我在Register方法中设置了默认值:

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

即使我尝试List在我的构造函数中初始化UserControl,我仍然在重新加载Designer时遇到错误.我不认为问题List是null或者SelectedItem.Data是一条糟糕的道路.

编辑:好吧,即使只是这导致我的设计器无法加载,给出"对象引用"错误:

<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
                      TemplateData="{Binding}"/>
Run Code Online (Sandbox Code Playgroud)

显然,有些东西不喜欢TemplateData财产受到约束.

编辑:为了添加神秘感,我可以查看我的整体/主要的设计视图Window,其中包括UserControl其设计视图给我"对象参考"错误.O_O

NVM*_*NVM 33

亚历克斯说的是要走的路.但我认为理解他在说什么有点令人困惑.

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

  • XDesProc.exe(这是XAML UI设计器),用于VS2012和较新的
  • devenv.exe适用于较旧的VS版本.

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

  • 请注意,在VS2012中,可能是Update1 +,您必须附加到正确的XDesProc.exe,而不是Visual Studio. (5认同)
  • 谢谢你的澄清.我尝试了这个,但没有出现在第二个VS窗口(我选择Attach to Process的那个窗口)中.我在第一个VS窗口中点击Reload Designer,它在错误列表中显示相同的"对象引用"错误,但从未弹出到第二个VS窗口.有没有办法在XAML中设置断点? (2认同)

小智 9

这个帖子真的很老了,但是我只是把它放在这里给那些遇到同样问题并通过Google来这里的人.

如果你在XAML中有'对象引用未设置为对象的实例',但是你的应用程序编译并运行正常,你通常会发现它的原因是构造函数中的某些东西在设计时无法解析.

虽然你可以在这个问题的其他答案的帮助下找到问题的根源,但有时你不能简单地解决这个问题,你需要在你的代码中完全按照你的需要,但你不想看到这个错误.

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

有关详细信息,请参见此处

在此输入图像描述

  • 这应该被标记为答案。 (2认同)

Cri*_*spy 8

它可能是用户控件的构造函数中的某些内容.VS2008 WPF设计器出现了一些问题.

在我们接手的项目中,我们补充说:

if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*x F 7

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