2015-06-11 75 views
3

我有一个非常奇怪的问题。我试图将一个属性绑定到DataContext,但它不起作用。这是我在做什么(在Window.Resources部分):无法绑定到DataContext

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

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

myWindow.DataContext = MyNameSpace.MySingleton.Instance; 

我没有得到任何错误,但绑定没有发生。所以我添加了一个调试器,看看我能想出了事情的原委:

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

我在转换器中设置一个断点,正在传递的值为空。考虑到事情不符合规定,我在设置DataContext的行上设置了一个断点。它首先被击中,然后是转换器中的断点。所以DataContext在绑定发生之前被设置。

最后,要尽量找些工作,我改变了这个:

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

这工作。

我真的不喜欢散布这样的绑定。我宁愿只绑定到DataContext。有问题的窗口包含许多绑定到DataContext上的属性,这些都可以正常工作。

任何人都可以解释我在这里做错了吗?

JAB

+0

“**代码中的其他地方**,我设置了数据上下文”。究竟在哪里? – adPartage

+0

如果该类不是从FrameworkElement派生的,那么它不是Visual Tree的一部分,因此DataContext不会自动“继承”。 – Silvermind

回答

0

我真是个白痴!

我开始回复@BradleyDotNET(顺便说一下,感谢您的回复,帮助我解决了这个问题),并找出了解决方案。我的类DOES来自FrameworkElement。我这样做是因为我需要使用数据绑定,即使它没有可见的组件。

我贴another question dealing with how to instantiate an object declared in the resource section。我仍然想知道答案,但是因为我的类是从FrameworkElement派生的,所以我不需要在资源部分声明它;我可以直接把它放在树上。这导致它被实例化并继承DataContext。

0

资源以及一些其他元素(如上下文菜单)不是可视树的一部分。

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

  1. 设置你的根元素,以便x:Name="Root"
  2. 使用您的绑定是这样的:

    MyProp="{Binding Source={x:Reference Root}, Path=DataContext.<YourProp>

这结合使用中,root f ramework元素作为“起点”,您可以正常进入数据上下文。