【问题标题】:Datacontext lost with dynamic xaml in WPFWPF 中的动态 xaml 丢失数据上下文
【发布时间】:2010-12-07 15:12:11
【问题描述】:

我有一个窗口,里面有一个简单的框架元素(我们称之为“myFrame”)。在 Window.Loaded 中,我正在使用 XamlReader.Parse(string) 解析一个字符串变量(从外部源加载),结果是一个 Page 对象(本地变量称为“myPage”)。我正在设置 myFrame.Content = myPage。

页面内部是一个标签,如下所示:

<label Name="DataBindingTestLabel" Content="{Binding Path=TestLabel, TargetNullValue='Null value'}" />

我正在尝试提供一个匿名类型(以便于测试)作为框架的数据上下文,例如:

this.ContentFrame.DataContext = new { TestLabel = "Hello, world." };

我已验证 DataContext 属性在设置后具有该值,并且只要我可以逐步执行窗口的执行,该值就会保持该值,但该值在窗口呈现之前的某个时间丢失并且回退值“Null”值,”显示出来。

启用数据绑定跟踪后,visual studio中的输出窗口显示:

System.Windows.Data 信息:41:BindingExpression 路径错误:找不到“对象”的“TestLabel”属性,因为数据项为空。这可能是因为数据提供者尚未生成任何数据。绑定表达式:路径=测试标签;数据项=空;目标元素是“标签”(名称=“DataBindingTestLabel”);目标属性是“内容”(类型“对象”)

非常感谢任何对我做错的事情的见解。

【问题讨论】:

  • 肯定有更多的事情发生。我无法在仅使用您显示的标签并将 DataContext 设置为匿名类型的项目中重现。
  • 我同意。 @Merick:你在使用动态 xaml 吗?
  • Smith - 我不确定动态 xaml 是什么意思。你的意思是你在运行时用 C# 代码而不是 xaml 创建 WPF 对象?
  • 没错。使用 XamlReader.Parse() 方法,我获取一个 xaml 字符串并从中创建一个控制树。
  • 我使用 XamlReader.Parse(...) 尝试了另一个测试,但它仍然成功。我最好的猜测是,动态 xaml 和匿名类型都不是问题,问题出在其他地方。

标签: c# .net wpf binding datacontext


【解决方案1】:

我希望其他人可以确认这一点,因为我自己最近才使用匿名类型,但是关于匿名类型的 MSDN 文章似乎表明,正如我所怀疑的那样,您的匿名类型已经过时了范围。在上面链接的页面的备注部分,它说“匿名类型具有方法范围”,所以我倾向于相信这是你的问题。

再次,我不完全确定,只是想我会就此事发表我的想法......

【讨论】:

  • 事实并非如此。我尝试将它与我创建的类一起使用。
  • 数字。问一个愚蠢的问题:你能验证标签是页面的孩子,页面是框架的孩子吗?我只问,因为如果标签不在框架的树中,它就不能继承框架的 DataContext。我敢肯定,这就像我在说“天是蓝的”,但我自己也容易犯这样的愚蠢错误……
  • 是的。如前所述,标签位于从字符串创建的页面内部,然后将整个页面设置为框架的内容。
【解决方案2】:

事实证明,框架元素在处理数据上下文时存在问题,而内容是页面元素。

解决方案是使用更通用的元素 (ContentControl),而不是让动态内容成为 Page 元素,而是使用 UserControl 元素。在此设置中,datacontext 不会丢失,并且绑定按预期工作。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多