How can I turn binding errors into runtime exceptions?
Just as there is "treat warning as errors" set in our projects to catch early possible problems, I would love to have a runtime exception to catch them early.
I have recently been bit by this problem and I would have been glad to have this.
Can it be done? And if yes, how?
Solution 1:
You could hook into the PresentationTraceSources
collection with your own listener:
public class BindingErrorListener : TraceListener
{
private Action<string> logAction;
public static void Listen(Action<string> logAction)
{
PresentationTraceSources.DataBindingSource.Listeners
.Add(new BindingErrorListener() { logAction = logAction });
}
public override void Write(string message) { }
public override void WriteLine(string message)
{
logAction(message);
}
}
and then hook it up in code-behind
public partial class MainWindow : Window
{
public MainWindow()
{
BindingErrorListener.Listen(m => MessageBox.Show(m));
InitializeComponent();
DataContext = new string[] { "hello" };
}
}
Here is the XAML with a binding error
<Grid>
<TextBlock Text="{Binding BadBinding}" />
</Grid>
Solution 2:
I implemented a solution very similar to the one proposed by Dean Chalk:
- Derived a
TraceListener
that throws instead of logging - Added that listener to
PresentationTraceSources.DataBindingSource
Please see the complete solution on GitHub, it includes a demo application and a unit test project.