我有一个窗口,里面有一个简单的框架元素(我们称之为“myFrame”)。在Window.Loaded中我正在使用XamlReader.Parse(字符串)解析字符串变量(从外部源加载),结果是一个Page对象(本地var称为“myPage”)。我正在设置myFrame.Content = myPage。
页面内部是一个标签,如下所示:
<label Name="DataBindingTestLabel" Content="{Binding Path=TestLabel, TargetNullValue='Null value'}" />
我试图提供一个匿名类型(为了便于测试)作为框架的datacontext,如:
this.ContentFrame.DataContext = new { TestLabel = "Hello, world." };
我已经验证了DataContext属性在设置之后具有值,并且只要我可以单步执行窗口的执行就保持该值,但是在渲染窗口之前的某个时间丢失值并且返回值为“Null”值,“显示。
启用数据绑定跟踪后,visual studio中的输出窗口显示:
System.Windows.Data信息:41:BindingExpression路径错误:找不到'object'的'TestLabel'属性,因为数据项为null。这可能是因为数据提供者尚未生成任何数据。 BindingExpression:路径= TestLabel;的DataItem = NULL; target元素是'Label'(Name ='DataBindingTestLabel'); target属性是'Content'(类型'Object')
非常感谢任何对我做错事情的见解。
答案 0 :(得分:0)
我希望其他人可以证实这一点,因为我最近才使用匿名类型,但关于匿名类型的MSDN文章似乎表明,正如我所怀疑的那样,你的匿名类型就是超出范围。在上面链接的页面的备注部分,它说“匿名类型有方法范围”,所以我倾向于认为这是你的问题。
同样,我不完全确定,只是想我会就此事提出自己的看法......
答案 1 :(得分:0)
事实证明,框架元素在处理数据上下文时存在问题,而内容是页面元素。
解决方案是使用更通用的元素(ContentControl),而不是让动态内容成为Page元素,我们使用的是UserControl元素。在此设置中,datacontext不会丢失,绑定按预期工作。