2010-08-20 204 views
26

当我尝试为我的XAML UserControl重新加载设计器时,出现“未设置为对象实例的对象引用”错误。 Visual Studio中突出了以下行为的问题:WPF,设计器中的'未将对象引用设置为对象的实例'

<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视图加载得很好,所以我认为那里没有问题。在我的名为cbo_templates的XAML中有一个ComboBox,其中包含我的Template类的实例,该类具有Data属性(因此SelectedItem.Data)。但是,如果我从上述XAML中的Path中删除.Data,我仍然收到“对象引用”错误,所以我不认为问题在于我试图访问null上的Path属性。这里是我的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看起来不运行的应用程序。任何想法可能是错的?它构建得很好,我在Build Output中看不到任何绑定问题。

编辑:这里是两个UserControl S中的构造函数代码:

构造的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)检查,但这没有帮助 - 重新加载Designer时仍然出现“对象引用”错误。

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

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

即使我尝试初始化在构造函数中ListUserControl,我还是重装设计时得到的错误。我不认为问题是List为空或SelectedItem.Data是一个不好的路径。

编辑:没关系,哪怕只是有这导致我的设计不加载,给予“对象引用”错误:

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

也有一些是它不喜欢有关TemplateData财产的约束,显然。

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

+0

在两个usercontrols的构造函数中是否有任何代码? – Goblin 2010-08-20 18:02:56

+0

@Goblin:更新我的问题以显示构造函数代码。 – 2010-08-20 18:09:33

回答

29

Alex说的是要走的路。但我认为它有点困惑,无法理解他在说什么。

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

  • VS2012 XDesProc.exe(这是XAML UI设计器)和新
  • devenv.exe年长VS版本。

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

+2

感谢您的澄清。我试过这个,但没有在第二个VS窗口中显示出来(我选择了Attach to Process)。我在我的第一个VS窗口中打了Reload Designer,它在错误列表中显示了相同的“对象引用”错误,但从未弹出到第二个VS窗口。有没有办法在XAML中设置断点? – 2010-08-20 18:15:40

+0

其实我以前没有看到你的xaml。我认为这个问题是SelectedItem.Data。 SelectedItem为空,并且您正在引用数据。哈哈,现在我读了你的文字。抱歉!!! – NVM 2010-08-20 18:18:14

+0

@NVM:我不知道,即使我在'Binding'中删除了所有的东西,只会说'Binding ElementName = cbo_templates',我得到了错误。 – 2010-08-20 18:19:43

7

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

+0

通过'选择另一个Visual Studio实例作为调试的可执行文件',你的意思是'附加到进程'? – 2010-08-20 18:10:09

+0

您可以使用“附加到进程”,或打开“项目属性”,“调试”,执行调试会话的可执行文件,并使用启动Visual Studio的命令填充命令行。然后执行“开始调试”命令。另一个VS实例启动。在这种情况下,请在客户端窗体或XAML页面上使用用户控件。 – 2010-08-20 18:26:50

+0

下面的NVM解释了如何去做这件事,但正如我在评论中所说的那样,我无法让VS 2010的第二个实例显示关于“对象引用”错误的任何错误消息。 – 2010-08-20 19:44:56

8

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

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

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

用户控件的构造下这个现象发生,以避免错误的开始。

2

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

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

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

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

工作得很好。

0

在Visual Studio 2015 WPF:

  1. 哈弗用你的鼠标在设计视图中的“未设置为一个对象的实例对象引用”。
  2. 等待一(几)秒,你会看到一个弹出
  3. 选择“查看异常详细信息”(你还会看到“查看代码”和“删除这个元素”
  4. 这个对话框告诉你的异常,堆栈跟踪

希望这有助于。

如果你这样做的XAML,你只会看到了异常,但不是以“查看异常详细信息”弹出,所以你需要在Designer/Design视图中完成。

+1

当我将鼠标悬停在它上面时,没有任何反应 - 我只是拿到了工具提示 – markmnl 2016-11-10 00:12:35

2

这条线程真的很老,但我只是把这个问题放在这里给那些有同样问题并且通过Google来到这里的人。

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

虽然您可以通过其他问题的答案找出问题的根源,但有时候您无法简单地修复这些问题,但您完全按照自己的代码在代码中使用它,但是您不必不想看到这个错误。

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

有关详细信息,请参阅here

enter image description here

0

我能够给一个名字到一个对象后,来解决这个问题。这是VS2015,我的标记是不同的,但它也可以帮助别人:

<ResourceDictionary> 
    <DataTemplate x:Key="ThisKeySolvesDesignersNullRef" 
        DataType="local:MyViewModel"> 
     <local:MyControl/> 
    </DataTemplate> 
</ResourceDictionary> 
相关问题