2011-09-26 67 views
0

我在寫標記擴展。我有這樣的XAML當前綁定值

<TextBlock Text="{ui:Test SomeInfo}" /> 

和帶構造函數的TestExtension帶一個字符串參數。我得到「SomeInfo」字符串,所以一切都找到了。現在我想嵌套擴展和寫東西像

<TextBlock Text="{ui:Test {Binding PropName}}" /> 

並且它不起作用。我不得不添加構造函數,該構造函數接受System.Windows.Data.Binding類型的一個參數。

現在我需要知道

  1. 我應該如何檢索來自綁定對象的電流值?
  2. 我應該什麼時候這樣做?我應該每次在ProvideValue方法中訂閱某種方式的變化還是要求這個值?

UPDATE1 PROPNAME應該反對的TextBlock的DataContext的解決。

UPDATE2剛剛發現相關的問題:How do I resolve the value of a databinding?

回答

4

綁定這樣是行不通的,因爲你的MarkupExtension沒有DataContext,它不會出現在可視化樹,我不認爲你應該有約束力的互動直接對象。你真的需要這個擴展嗎?也許你可以單獨使用綁定和converter

如果你不可以創造出具有可綁定屬性(由DependencyObject繼承)的專用類,然而,這仍然不能給你所需要的ElementName一個DataContext或名稱範圍或者需要RelativeSource可視樹,所以在這種情況下進行綁定工作的唯一方法是使用Source(例如將其設置爲StaticResource)。這並不理想。

另請注意,如果您不直接設置綁定,ProvideValue方法將只會被調用一次,這意味着即使您的擴展中有綁定,它也可能不是很有用(有一些例外,例如返回時複雜的內容,例如使用綁定的ItemsControl,但您在TextBlock.Text上設置的擴展名只是一個字符串),所以我真的懷疑,如果值應該根據綁定動態更改,那麼您希望使用像這樣的MarkupExtension。如前所述:請考慮使用convertersMultiBindings代替各種值。

+0

其實,我想使用Textblock的DataContext。 – adontz

+0

@adontz:正如我所說,你可能最好使用一個普通的綁定與轉換器,讓自己的MarkupExtension內的綁定工作是一個痛苦。 –

+0

我接受這種痛苦,因爲它爲標記用戶提供了對我來說更重要的更一致的語法。 – adontz