当前位置: 首页 > 知识库问答 >
问题:

无法绑定到数据上下文

姬成荫
2023-03-14

我遇到了一个很奇怪的问题。我尝试将属性绑定到DataContext,但它不起作用。这是我正在做的事情(在橱窗里)。资源部分):

<myNS:MyClass x:Key="myObj" MyProp="{Binding}"/>

代码的其他地方,我像这样设置数据上下文:

myWindow.DataContext = MyNameSpace.MySingleton.Instance;

我没有收到任何错误,但绑定没有发生。所以我添加了一个调试转换器,看看我是否可以弄清楚发生了什么:

<myNS:MyClass x:Key="myObj" MyProp="{Binding Converter={StaticResource Debug}}"/>

我在转换器中设置了一个断点,传递的值为 null。确定事情不正常,我在设置 DataContext 的行上设置了一个断点。它首先被击中,然后是转换器中的断点。因此,在绑定发生之前设置了数据上下文。

最后,为了让一些东西发挥作用,我改成了这样:

<myNS:MyClass x:Key="myObj" MyProp="{Binding Source={x:Static myNS:MySingleton.Instance}}"/>

这奏效了。

我真的不喜欢这样散开装订。我宁愿只绑定到DataContext。所讨论的窗口包含许多到DataContext上的属性的绑定,这些都可以正常工作。

谁能解释一下我做错了什么吗?

共有2个答案

晏正豪
2023-03-14

我真是个白痴!

我开始回复@BradleyDotNET(顺便说一下,谢谢你的回复。这是帮助我解决问题的原因),并找到了解决方案。我的类确实派生自FrameworkElement。我这样做是因为我需要利用数据绑定,尽管它没有可见的组件。

我发布了另一个关于如何实例化在资源部分声明的对象的问题。我仍然想知道答案,但是由于我的类派生自Frameworks Element,我不需要在资源部分声明它;我可以直接把它放在树中。这导致它被实例化并继承DataContext。

丌官盛
2023-03-14

资源以及上下文菜单等一些其他元素不是视觉树的一部分。

因此,他们没有从中获取数据上下文的管理FrameworkElement。通常,标准类不会利用绑定语法,因为它需要从DependencyObject派生,但如果您最终需要资源中的绑定(例如,对于转换器),您可以使用以下技巧:

> < li >将根元素设置为< code>x:Name="Root" < li>

像这样使用绑定:

MyProp=“{Binding Source={x:Reference Root}, Path=DataContext.

这使用根框架元素作为“起点”进行绑定,您可以正常地访问数据上下文。

 类似资料:
  • 如何将 itemcount 绑定到我的数据上下文以计算每个组中的所有项目,然后将其显示在标题中 我的项目绑定到的 视图模型 数据上下文 它之前用这个工作过 System. Windows. Data错误:4:找不到与引用绑定的源 'RelativeSource FindAncestor, AncestorType='System. Windows. Control. UserControl', A

  • 我发现需要绑定到的,设置如下: 在设计时。但是,我需要从具有不同数据上下文的子控件绑定到它: 由于 是为 设置的,因此我的 的数据设置为收款人集合中的各个对象。我的视图有一个属性,我需要从转换器中的引用该属性来确定项目的可见性。 我可以根据对象的属性设置可见性,如下所示: 但是我真正需要绑定到的是的的属性。有没有办法从子控件中获取该上下文?我使用的是WinRT,所以我没有绑定源的好处。 编辑 正如

  • 我的布局名称是。我还看到了Android-DataBinding-绑定类将如何和何时生成?但这帮不了我。

  • 当我试着运行appium时,突然遇到了这个错误。 错误:处理命令时发生未知的服务器端错误。原始错误:执行adbExec时出错。原始错误:“Command”C:\Users\vsingh\AppData\Local\Android\Sdk\platform tools\adb。exe-P 5037-s emulator-5554转发tcp:8200 tcp:6790'已退出,代码为1';斯特德:亚行

  • 我制作了一个Azure函数(http触发器),并使用Visual Studio 2019将其部署在门户中。 该函数工作正常,我现在将添加一个绑定到我的CosmosDB。我导航到我的函数,然后单击“集成”。现在我看到了触发器、函数以及输入和输出绑定。 我应该可以在这里添加一个新的输入绑定。但我没有“添加”按钮。我做错了什么?

  • 我正在使用JdbcTemplate。queryForObject(字符串sql、RowMapper、RowMapper、Object…args)从Oracle获取一行,但继续获取EmptyResultDataAccessException结果大小不正确:应为1,实际为0。 我已经使用Oracle SQL Developer验证了我的SQL,它返回了1行,就像它应该返回的一样。 > 这一直失败。 这