How to locate the source of a binding error? How to locate the source of a binding error? wpf wpf

How to locate the source of a binding error?


If you do not know which binding fails

I would use the Snoop utility for this purposes. In short - at the top-left corner above the visual tree, you'll find a drop-down list which allows filtering visuals, just select Visuals with binding Error. See online documentation for more details.

If you know which binding fails

Sometime you know which binding fails but was not able to find a source fo the problem since binding is pretty tricky, for instance TemplateBindings, bindings which refer to a DataContext of another control, etc.. I found helpful putting a TextBlock which Text property is bound to the same binding source in this way you can see what exactly bound since TextBlock will display a type name of a bound object.

For instance you have following failed binding:

<ItemsControl ItemsSource="{Binding Parent.DataContext.ActiveItem.DataContext}" /><!-- See what is bound, if failed - try previous level  --><TextBlock Text="{Binding Parent.DataContext}" /><TextBlock Text="{Binding Parent.Inner.Items}" /><TextBlock Text="{Binding Parent.Inner}" />

Useful links:


I have been happily using the wonderful snippet from 'Switch on the Code' to detect and report binding errors since it was first published in 2009...

http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors

edit: still works excellently on VS2012 (Sept 2013)

Update 25 Jan 2016

The link appears broken, so I'll paste in the relevant snippets...

using System.Diagnostics;using System.Text;using System.Windows;namespace SOTC_BindingErrorTracer{    public class BindingErrorTraceListener : DefaultTraceListener    {   //http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors        private static BindingErrorTraceListener _Listener;        public static void SetTrace()        { SetTrace(SourceLevels.Error, TraceOptions.None); }        public static void SetTrace(SourceLevels level, TraceOptions options)        {            if (_Listener == null)            {                _Listener = new BindingErrorTraceListener();                PresentationTraceSources.DataBindingSource.Listeners.Add(_Listener);            }            _Listener.TraceOutputOptions = options;            PresentationTraceSources.DataBindingSource.Switch.Level = level;        }        public static void CloseTrace()        {            if (_Listener == null)            { return; }            _Listener.Flush();            _Listener.Close();            PresentationTraceSources.DataBindingSource.Listeners.Remove(_Listener);            _Listener = null;        }        private StringBuilder _Message = new StringBuilder();        private BindingErrorTraceListener()        { }        public override void Write(string message)        { _Message.Append(message); }        public override void WriteLine(string message)        {            _Message.Append(message);            var final = _Message.ToString();            _Message.Length = 0;            MessageBox.Show(final, "Binding Error", MessageBoxButton.OK,              MessageBoxImage.Error);        }    }}

And to set it up/initialize it...

namespace WpfListeningForTraceErrors{    /// <summary>    /// Interaction logic for Window1.xaml    /// </summary>    public partial class Window1 : Window    {        public Window1()        {            BindingErrorTraceListener.SetTrace();            InitializeComponent();        }    }}


You can add this to every control that binds

  PresentationTraceSources.TraceLevel="High" 

And run the program in debug, the detailed binding information will appear in your Output window. It may help a bit. You can also create a pass though converter to catch an error (catches the problem some times but not always). There are no good tools for debugging XAML in general that I am aware of.