Debugging Data Binding
You may have noticed that our age text box's binding options have gotten fairly involved:
<TextBox ... Foreground="{Binding Path=Age, Source={StaticResource Tom}, Converter={StaticResource ageConverter}}" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"> <TextBox.Text> <Binding Path="Age" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <local:NumberRangeRule Min="0" Max="128" /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
There's a lot going on here and it would be easy to get some of it wrong. For example, if we had a background in journalism, we might have used one-based indexing instead of zero-based indexing to access the first error in our list of validation errors when setting up the binding for the tool tip:
<TextBox ...
ToolTip="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[1].ErrorContent}">
...
</TextBox>In this case, as in most others, the WPF data binding engine will simply swallow the error so as not to disturb our user friends.[34] So, how are we to find it? Well, you need only check the debug output to see the error shown in Example 6-30, and all will be revealed.
Example 6-30. Watch debug output for help debugging data binding problems
System.Windows.Data Error: 12 : Cannot get '' value (type 'ValidationError') from'(Validation.Errors)' (type 'ReadOnlyObservableCollection'1')BindingExpression:Path=(0).[1].ErrorContent; DataItem='TextBox' ...