Зачем помещать неактивный конвертер в привязку, чтобы изменить его поведение?
Я нахожусь в процессе тестирования пользовательского элемента управления, который я создал, и я сталкиваюсь с чем-то необъяснимым для меня.
Элемент управления является расширением ComboBox, который обрабатывает значения определенного пользовательского типа. У него есть свойство зависимости этого пользовательского типа, которое является целевым свойством Binding.
У меня есть оператор трассировки в установщике, и я вижу, что свойство устанавливается. Но это не появляется в моем пользовательском контроле.
Теперь, как правило, я бы сказал, хорошо, у меня есть ошибка в моем пользовательском элементе управления. Я, вероятно, знаю, хотя я озадачен этим. Но этот вопрос не о том, чтобы найти ошибку в моем контроле. Читать дальше; вот где это становится странным.
Я также использую небольшой конвертер значений Bea Stollnitz для отладки Binding:
public class DebuggingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value; // Add the breakpoint here!!
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("This method should never be called");
}
}
Идея заключается в том, что я добавляю этот конвертер в свой Binding и могу установить точку останова, чтобы увидеть, какое значение выдвигается к цели. Хорошо, это работает просто отлично. Я вижу, что значение выталкивается.
На самом деле, это работает немноготоже хорошо. Если DebuggingConverter присоединен к Binding, пользовательский элемент управления отображает значение. Если это не так, это не так.
Как это вообще возможно? Как конвертер значений, который ничего не меняет, влияет на поведение привязанного элемента управления?
Редактировать:
Не то чтобы это могло помочь, но вот XAML для пользовательского элемента управления:
<a:CodeLookupBox
Grid.Column="1"
Grid.IsSharedSizeScope="True"
MinWidth="100"
Style="{Binding Style}">
<a:CodeLookupBox.CodeLookupTable>
<Binding Path="Codes" Mode="OneWay"/>
</a:CodeLookupBox.CodeLookupTable>
<a:CodeLookupBox.SelectedCode>
<Binding Path="Value" Mode="TwoWay" ValidatesOnDataErrors="True"/>
</a:CodeLookupBox.SelectedCode>
</a:CodeLookupBox>
Без конвертера на второй привязке управление ведет себя так, как будто я не установилSelectedCode
, Хотя след в утвержденииOnSelectedCodePropertyChanged
обработчик показывает, чтоe.Value
действительно содержит правильное значение. Это происходит независимо от того, подключен конвертер или нет.
Я пытался провести обратный инжиниринг этой проблемы с помощью мысленного эксперимента: если бы вы хотели создать связанный пользовательский элемент управления, поведение которого изменилось бы, если бы к его привязке был присоединен неоперационный преобразователь, как бы вы это сделали? Я не знаю достаточно о связывании, чтобы придумать ответ.