2011-11-07 26 views
4

我有一個簡單的IValueConverter,它只是使用TypeConverter做轉換。但有些情況下,提供的TypeConverter將會失敗。默認IValueConverter

如果Binding沒有提供轉換器,我想回退到任何WPF將使用。使用反射器我已經確定有一個DefaultValueConverter但是它在MS.Internal.Data內部。

有沒有簡單的方法,我可以讓我的手DefaultValueConverter或做同樣的事情?

+1

我只想創建自己的項目中「重複」 MyDefaulValueConverter,繼續前進。 –

+0

Amby提供了一個很好的建議,雖然我不確定許可證是在複製他們的代碼。如果事實證明你被允許,你可以使用http://wiki.sharpdevelop.net/ILSpy.ashx來提取源代碼。 –

+1

他們的代碼,我剛纔看到它,有點太複雜太複製,我不會建議!嘗試修復而不是錯誤。 –

回答

2

我看了一下.NET反射器,似乎沒有官方的方式來獲得默認值轉換器。

你所需要的是精確的是要調用的方法

internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource); 

MS.Internal.Data.DataBindEngine類。

您將獲得當前DataBindEngine與靜態內部屬性

internal static DataBindEngine CurrentDataBindEngine 

始終在DataBindEngine類運行的線程。

問題在於班級是內部的!

我也查看是否有公開使用該方法的東西,但實際上該方法和默認值轉換器類(有多個!)僅在內部數據綁定類中使用,因此,沒有出路,對不起。

你可以使用反射來訪問內部成員,但這將是一個非常糟糕的骯髒的黑客! 要做到這一點,請訪問靜態屬性DataBindEngine.CurrentDataBindEngine,然後訪問方法GetDefaultValueConverter,並始終使用反射。 用屬性[Obsolete]包裝一個靜態函數:)

也許更簡潔的方法是使用默認的手寫轉換。

你可以試着理解它爲什麼會給你錯誤或者寫一個可以處理特殊情況的代碼。他們的代碼相當複雜且相互關聯,我不會建議複製他們的代碼。

有時WPF讓我很生氣,很多與數據綁定相關的東西都是隱藏的,內部的或者不夠通用的,這是一個非常糟糕的設計選擇,我不明白。

舊的TypeConverter有時足夠了。這取決於你必須做什麼。

public static object MyConvert(object value, Type t) 
{ 
    TypeConverter tc = TypeDescriptor.GetConverter(t); 
    return tc.ConvertFrom(value); 
} 

您也可以嘗試靜態方法Convert.ChangeTypeIConvertible工作。

我想問題不在於轉換您的對象,而是將其轉換爲依賴項屬性使用的值(或反之亦然)。 爲此,公共類XamlValueConverter,在默認值轉換器內部也使用。 然而,這會變得很複雜,所以......不是一個真正簡單的解決方案來解決您的問題。由於Merlyn一直在說,我開始相信反射可能是更合適的方式。

+1

少了測試和支持。而且,如果他們以後決定採用不同的解決方案,它不會將它們繪製到角落。如果在發佈後人們需要它,這是一個簡單的換線,大量的設計和測試(他們可能能夠利用已經間接驗證默認轉換代碼的測試),並且完成。 –

+1

的確很有可能的答案,但它仍然很生氣:)希望下一次發佈會有所改變。事實上,數據綁定的實現非常複雜。希望在接下來的版本中,他們使用更少的反射和更多的Reflection.Emit :)使它更具性能。 –

+1

你稱之爲邪惡和骯髒,但如果它會給出最少的令人驚訝的行爲,我會說這就是應該做的。如果沒有提供類似的可公開訪問的功能*,它很可能不會被刪除或更改。因此,您可以利用.Net Framework進展的相對緩慢的勢頭,並假設它們可能不會在修補程序或服務版本中刪除它。如果您對它發表評論,那麼您將放置麪包屑線索,以便在發生問題時輕鬆修復發生的任何錯誤。 –

0

由於DefaultValueConverter是內部MS.Internal.Data最好是創建自己的默認值轉換器的版本