Debug Databinding Issues in WPF
DataBinding is one of the most powerful features in WPF. But because it resolves the bindings at runtime and does not throw exceptions, it's sometimes hard to find the reason why the data do not appear as expected. There are mainly two reasons:- The DataBinding expression is invalid. Then use Trace Output to resolve.
- The DataBinding expression is valid, but the result is not the expected. Then use a Debug Converter to resolve it.
Method 1: Trace messages in the output window
In the example, the text property of the TextBlock is bound to the property "InvalidPath" of the StackPanel - which does not exists.<Window x:Class="DebugDataBinding.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <StackPanel x:Name="stack"> <TextBlock Text="{Binding ElementName=stack, Path=InvalidPath}" /> </StackPanel> </Window>
System.Windows.Data Error: 39 :
BindingExpression path error: 'InvalidPath' property not found on
'object' ''StackPanel' (Name='stack')'.
BindingExpression:Path=InvalidPath; DataItem='StackPanel'
(Name='stack'); target element is 'TextBlock' (Name=''); target property
is 'Text' (type 'String')
Adjust the trace level (.NET 3.5 and higher)
NET3.5 has a new feature that allows you to set the level of details of trace messages toNone
, Low
, Medium
or High
.To set the trace level you have to include an extra namespace to your XAML:
<Window x:Class="DebugDataBinding.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"> <StackPanel x:Name="stack"> <TextBlock Text="{Binding ElementName=stack, Path=InvalidPath, diag:PresentationTraceSources.TraceLevel=High}" /> </StackPanel> </Window>
PresentationTraceSources.DataBindingSource.Listeners.Add( new ConsoleTraceListener()); PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.All;
Method 2: Use a ValueConverter to break into the debugger
A simple trick is to write a value converter that does nothins except breaking into the debugger. All you need to do now is to add this converter to the binding expression that fails and you can easily see the values that should be bound./// <summary> /// This converter does nothing except breaking the /// debugger into the convert method /// </summary> public class DatabindingDebugConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Debugger.Break(); return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { Debugger.Break(); return value; } }
<Window x:Class="DebugDataBinding.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:DebugDataBinding" Title="Window1" Height="300" Width="300"> <Window.Resources> <local:DatabindingDebugConverter x:Key="debugConverter" /> </Window.Resources> <StackPanel x:Name="stack"> <TextBlock Text="{Binding ElementName=stack, Path=ActualWidth, Converter={StaticResource debugConverter}}" /> </StackPanel> </Window>
No comments:
Post a Comment