[英]Accessing Binding from Type Converter?
我花了很多時間嘗試許多不同的方法來解決我遇到的問題,但無濟於事,所以我希望這里的人能為您提供幫助。
我有一個帶有雙向綁定的Text Box元素,該元素利用類型轉換器將值從字符串轉換為自定義數據類型,例如MyCustomType
。 一切正常,但是由於我的項目要求發生了變化,我現在需要在進行轉換之前執行額外的處理。
但是,為了執行此額外處理,我需要能夠訪問“源”文本框或綁定上下文。 我都無法訪問。
是否可以通過類型轉換器的ConvertFrom()
方法訪問源文本框?
我嘗試使用(通過WPF)傳遞給ConvertFrom()
方法的ITypeDescriptorContext
參數,但是其中的大多數屬性為null。
即
public class MyCustomTypeConverter : TypeConverter
{
...
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
// Context is
return new MyCustomType(value);
}
...
}
我也嘗試過使用MultiValueConverter
,並且完全避免使用Type轉換器,但是這導致了很多額外的代碼,並沒有真正的幫助。 我寧願避免沿着這條路線走,因為類型轉換器要優雅得多。
任何建議/協助將不勝感激! :)
編輯:我最終改變了執行驗證的方式(使用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)
仍然感謝您的幫助。 :)
編輯:要訪問此TextBox的綁定,只需將sourceTextBox
為TextBox
,然后:
var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.