2010-06-15 128 views
1

我試圖編寫自定義MarkupExtension,它允許我使用自己的機制來定義綁定,但是當我嘗試返回我的MarkupExtensionMultiBinding我收到上述例外。'System.Windows.Data.MultiBinding'不是屬性'Text'的有效值

我:

<TextBlock Text="{my:CustomMarkup ...}" /> 

CustomMarkup返回MultiBinding,但顯然Text不喜歡被設置爲MultiBinding。當我說:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding ... /> 
    </TextBlock.Text> 
</TextBlock> 

但是它不能正常工作嗎?

回答

2

不要歸還MultiBinding本身。相反,返回MultiBinding.ProvideValue的結果。

順便說一句,你在做什麼標記擴展?也許你可以繼承MultiBinding,如果你不需要覆蓋ProvideValue(這是密封的)。你可以通過設置合適的Converter和其他屬性來實現幾乎任何事情

+0

正是我要寫的東西,但你打敗了我。 – 2010-06-15 22:49:42

+0

有趣。我的自定義擴展實際上給了我一種方法來在我的代碼隱藏中定義綁定作爲方法的結果,並從我附加到方法的自定義屬性獲取綁定的依賴關係。如果我自己不這樣說,這很酷。 :) 我正在考慮發佈它,如果它最終工作出色。 – devios1 2010-06-15 22:51:59

+0

我在MIT許可下發布了我的自定義擴展:http://hip.codeplex.com/ – devios1 2010-06-26 06:42:37

0

做了一些調查,事實證明我應該在MarkupExtension的ProvideValue方法中實際設置綁定,然後返回綁定的當前值。有點反直覺,但迄今似乎工作!

這裏大概是我結束了:

public override object ProvideValue(IServiceProvider serviceProvider) { 
    IProvideValueTarget valueProvider = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
    // only need to do this if they're needed in your logic: 
    object @target = valueProvider.TargetObject; 
    object @property = valueProvider.TargetProperty; 

    MultiBinding result = new MultiBinding(); 

    // set up binding as per custom logic... 

    return result.ProvideValue(serviceProvider); 
} 

輕輕放入少許邏輯,灰塵與錯誤處理和服務。

更新:原因MultiBinding.ProvideValue()基於serviceProvider中的目標和屬性信息掛鉤了綁定本身。這更乾淨。

+0

我認爲MultiBinding.ProvideValue已經執行BindingOperations.SetBinding ...所以你做了兩次 – 2010-06-15 22:44:26

+0

P.S.我只是使用'@'符號來使變量看起來特殊......不起作用。 – devios1 2010-06-15 22:44:38

+0

等一下,怎麼可能?直到我設置它才知道綁定是什麼。 – devios1 2010-06-15 22:45:34

相關問題