2015-06-11 111 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元素作爲「起點」,您可以正常進入數據上下文。