2016-04-18 90 views
0

我花了一段時間嘗試了很多不同的方法來解決我遇到的問題,但都無濟於事,所以我希望這裏有人能夠提供幫助。從類型轉換器訪問綁定?

我有一個帶雙向綁定的文本框元素,它利用類型轉換器將字符串的值轉換爲自定義數據類型,例如MyCustomType。這工作正常,但是由於項目需求的變化,我現在需要在轉換之前執行額外的處理。

但是,爲了執行這個額外的處理,我需要能夠訪問「源」文本框或綁定上下文。我無法訪問這兩者。

有沒有什麼辦法從類型轉換器的ConvertFrom()方法訪問源文本框?

我試圖使用ITypeDescriptorContext參數(WPF)傳遞給ConvertFrom()方法,但是其中的大多數屬性均爲null。

public class MyCustomTypeConverter : TypeConverter 
{ 
    ... 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     // Context is 
     return new MyCustomType(value); 
    } 
    ... 
} 

The context within ConvertFrom()

Context - additional properties

我已經使用MultiValueConverter,並且完全避免了類型轉換器也試過,但是這導致了額外的代碼LOT,和並沒有真正的幫助。我寧願避免走這條路,因爲類型轉換器更優雅。

任何意見/援助將不勝感激! :)

+1

爲什麼你要訪問的約束力?可能是有其他的方式 – Nitin

+0

我不認爲它有可能從TypeConverters訪問綁定。他們必須在DataLayer上運行,似乎也是很多不必要的工作。如果你更新了這個問題,那麼人們可以很容易地幫助你解決問題。 –

+0

@Nitin,我試圖訪問源文本框,以便我可以將它傳遞給另一個方法(作爲參考),以便我可以在驗證失敗時執行特定的任務。 這不一定是實現這一目標的最佳方式,但是項目的要求在開發階段的相當晚的時候已經發生了變化,這是一種功能性的,暫時性的解決方案。 (當我得到一些時間的時候,我的重構列表中的值很高)。 謝謝你們的迴應。 – XtraSimplicity

回答

1

編輯:我最終改變該驗證執行方式(使用INotifyDataError,而不是驗證的例外),並最終重新寫在我喜歡的類型轉換器的ConvertFrom()方法,這樣我就不會需要訪問TypeDescriptor的上下文了。

我不會推薦使用ConvertFrom()方法的上下文,因爲它(作爲一個私有屬性)並不保證該屬性將來會存在(雖然我沒有讀過任何東西來支持這個,最好是假設私有財產可以被刪除/重命名,而不從MS開發團隊通知),並以編程方式設置屬性的值時,像這樣沒有設置:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(MyCustomType)); 
converter.ConvertFrom(mySourceValue); 

如果你閱讀本文並確實需要訪問context參數,則可以使用下面的方法進行操作,需要您自擔風險。


我能夠通過詢問ValueConverterContext類和訪問私有_targetElement場,這樣對解決這個問題:

var sourceTextBox = context.GetType().GetField("_targetElement", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context) 

感謝您的幫助仍然。:)

編輯:要訪問綁定該文本框,你可以簡單地投sourceTextBoxTextBox,然後:

var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty);