我正在测试一个自己构建的用户控件,但是遇到了一个对我来说无法解释的问题。
这个控件是ComboBox的扩展,用于处理特定自定义类型的值。它有一个依赖属性,用于绑定该自定义类型的目标属性。
我在setter中添加了追踪语句,可以看到该属性已被设置。但它并没有出现在我的用户控件中。
通常情况下,我会说,好吧,我的用户控件里肯定有bug。尽管我感到困惑,但我可能确实存在这样的问题。但是,这个问题不是关于查找我的控件中的错误。请继续阅读;接下来的部分变得奇怪起来。
我还使用了Bea Stollnitz的小值转换器来帮助调试绑定:
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");
}
}
这个想法是我将这个转换器添加到我的绑定中,然后设置断点以查看推送到目标的值。好的,这很有效。我可以看到该值正在被推出。
事实上,它有点太有效了。如果将DebuggingConverter附加到绑定上,用户控件会显示该值。如果没有,则不会显示。
这怎么可能?一个什么都不做的值转换器如何影响绑定控件的行为?
编辑:
虽然这不太可能有帮助,但以下是用户控件的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”确实包含正确的值。无论是否附加了转换器,都会发生这种情况。
我一直在尝试通过思维实验来反向工程化解决此问题:如果您想创建一个绑定的用户控件,其行为会因为附加了一个空操作转换器而改变,您该如何做?我对绑定不了解足以提出答案。