当我尝试为我的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
答案 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。
答案 4 :(得分:2)
这个帖子有点旧,但是我遇到了一个问题,我刚刚帮助解决了问题,所以我可以稍微澄清一些观点。
为防止违规代码在设计时运行,我使用了
If System.ComponentModel.LicenseUsageMode.Runtime = 1 Then
myObject = New ObjectDefinition
End If
完美地运作。
答案 5 :(得分:0)
在Visual Studio 2015 for WPF中:
希望这有帮助。
如果您在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错误报告!