我遇到了一个非常奇怪的问题。我正在尝试将一个属性绑定(bind)到 DataContext,但它不起作用。这就是我正在做的(在 Window.Resources 部分):
<myNS:MyClass x:Key="myObj" MyProp="{Binding}"/>
在代码的其他地方,我像这样设置数据上下文:
myWindow.DataContext = MyNameSpace.MySingleton.Instance;
我没有收到任何错误,但绑定(bind)没有发生。所以我添加了一个调试转换器,看看我是否能弄清楚发生了什么:
<myNS:MyClass x:Key="myObj" MyProp="{Binding Converter={StaticResource Debug}}"/>
我在转换器中设置了一个断点,传递的值为空。发现事情出了问题,我在设置 DataContext 的行上设置了一个断点。它首先被击中,然后是转换器中的断点。因此,DataContext 是在绑定(bind)发生之前设置的。
最后,为了让一些东西起作用,我改成这样:
<myNS:MyClass x:Key="myObj" MyProp="{Binding Source={x:Static myNS:MySingleton.Instance}}"/>
成功了。
我真的不喜欢像这样展开绑定(bind)。我宁愿只绑定(bind)到 DataContext。有问题的窗口包含许多对 DataContext 属性的绑定(bind),这些都工作正常。
谁能解释一下我在这里做错了什么?
刺拳
最佳答案
资源以及其他一些元素(如上下文菜单)不是可视化树的一部分。
因此,它们没有管理 FrameworkElement 来从 获取数据上下文。通常,标准类不会利用绑定(bind)语法,因为它需要从 DependencyObject
派生。 ,但是如果您最终确实需要在资源中进行绑定(bind)(例如,对于转换器),您可以使用这个技巧:
- 将你的根元素设置为
x:Name="Root"
像这样使用您的绑定(bind):
MyProp="{Binding Source={x:Reference Root}, Path=DataContext.<YourProp>
这使用根框架元素作为“起点”进行绑定(bind),您可以正常访问数据上下文。
关于c# - 无法绑定(bind)到 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791021/