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

时间:2010-08-20 17:56:01

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

当我尝试为我的XAML UserControl重新加载Designer时,我收到“对象引用没有设置为对象的实例”错误。 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时,其Designer视图加载得很好,所以我认为那里没有问题。我的XAML中有一个名为ComboBox的{​​{1}},其中包含cbo_templates类的实例,该类具有Template属性(因此为Data)。但是,如果我从上面的XAML中的SelectedItem.Data中删除.Data,我仍然会收到“对象引用”错误,因此我认为问题不在于我正在尝试访问{ Path上的{1}}属性。这是我的Path XAML以防万一:

null

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

编辑:这里是<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的构造函数,带有“对象引用”错误:

UserControl

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

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

修改:我在设置UserControl属性之前尝试对构造函数进行InitializeComponent(); grd_templateDetail.DataContext = this; // refers to containing <Grid> in XAML 检查,但这没有帮助 - 仍然获得“对象引用”重新加载Designer时出错。

修改if (null != grd_templateList)使用的DataContext媒体资源是List。我在ComboBox方法中设置了默认值:

DependencyProperty

即使我尝试在Register的构造函数中初始化public static readonly DependencyProperty ListProperty = DependencyProperty.Register( "List", typeof(List<Template>), typeof(TemplateList), new PropertyMetadata( new List<Template> { _defaultTemplate } ) ); ,我仍然会在重新加载Designer时遇到错误。我认为问题不在于List为空或UserControl是一条糟糕的道路。

编辑好吧,即使这样做会导致我的Designer无法加载,也会出现“对象引用”错误:

List

显然,有些东西不喜欢被绑定的SelectedItem.Data属性。

修改:为了添加神秘感,我可以查看整体/主<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" TemplateData="{Binding}"/> 的设计视图,其中包含TemplateData,其设计视图为我提供了“对象引用“错误。 O_O

8 个答案:

答案 0 :(得分:33)

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

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

  • XDesProc.exe(XAML UI Designer)适用于 VS2012及更新版
  • devenv.exe代表较旧的VS 版本。

然后为用户控件执行“Reload Designer”并查看第二个VS实例中的输出以检查错误究竟是什么。

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:7)

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

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

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

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

有关详细信息,请参阅here

enter image description here

答案 4 :(得分:2)

这个帖子有点旧,但是我遇到了一个问题,我刚刚帮助解决了问题,所以我可以稍微澄清一些观点。

  1. 像往常一样在Visual Studio中加载解决方案。
  2. 打开VS的第二个实例,菜单调试/附加到进程/选择devenv。 你应该看不到任何壮观!在VS 2010中,我得到了 “在运行模式下无法显示反汇编。”
  3. 返回第一个打开解决方案的实例。加载或重新加载有问题的XAML     文件。如果您遇到问题(我在用户控件上有异常,因此无法加载该窗口),调试器应将违规代码指向第二个实例。在我的情况下,它非常 明确而明显。
  4. 为防止违规代码在设计时运行,我使用了

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

    完美地运作。

答案 5 :(得分:0)

在Visual Studio 2015 for WPF中:

  1. 将鼠标悬停在&#34;对象引用上,而不是设置为对象的实例&#34;在设计视图中。
  2. 等待(几)秒,你会看到一个弹出窗口
  3. 选择&#34; 查看例外详细信息&#34; (您还会看到&#34;查看代码&#34;和&#34;删除此元素&#34;
  4. 此对话框将显示例外情况和 StackTrace
  5. 希望这有帮助。

    如果您在XAML上执行此操作,您将只看到异常,但不会看到弹出的&#34;查看异常详细信息&#34;,因此您需要在Designer / Design视图中执行此操作。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

在我的UWP代码中编辑了很多XAML之后我今天遇到了这个错误,我无法弄清楚出了什么问题......但经过仔细检查后,我注意到我犯了这个错误:

main :: IO ()

solve :: String -> String

calculate :: [Int] -> Int

check :: Int -> Int

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

需要改进XAML错误报告!