2016-04-18 3 views
0

Я потратил немало времени на то, чтобы попробовать несколько разных способов решить проблему, которая у меня есть, безрезультатно, поэтому я надеюсь, что кто-то здесь может помочь.Доступ к привязке к конвертеру типов?

У меня есть элемент текстового поля с двусторонней привязкой, который использует конвертер типов для преобразования значения из строки в пользовательский тип данных, скажем, MyCustomType. Это работает отлично, однако из-за изменения требований моего проекта мне теперь нужно выполнить дополнительную обработку до конверсии.

Для выполнения этой дополнительной обработки, однако, мне нужно иметь доступ к текстовому полю «источник» или контексту привязки. Ни один из которых я не смог получить.

Есть ли способ получить доступ к исходному текстовому полю, из метода ConvertFrom() преобразователя типа?

Я попытался использовать параметр ITypeDescriptorContext, переданный (WPF) методу ConvertFrom(), однако большинство свойств в нем равны нулю.

т.е.

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

Я не считаю возможным доступ к Bindings из TypeConverters. Они должны работать на DataLayer, также кажется, много ненужной работы. Если вы обновите вопрос, в чем проблема, люди могут помочь вам так легко. –

+0

@Nitin, я пытался получить доступ к исходному TextBox, чтобы передать его другому методу (в качестве ссылки), чтобы я мог выполнять определенные задачи при отказе проверки. Это не обязательно лучший способ сделать это, однако требования проекта изменились довольно поздно на стадии разработки, и это функциональное, несколько временное решение. (Это довольно высокий показатель в моем списке вещей для рефакторинга, когда я получаю некоторое время). Спасибо вам за ваши ответы. – XtraSimplicity

ответ

1

EDIT: я в конечном итоге изменить способ, что проверка выполняется (с использованием 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); 
Смежные вопросы