Debugowanie BindingExpression w Windows Store Apps

Jedną z zalet XAML’a, DataBinding i MVVM jest to, że grafik i programista mogę swobodnie pracować nad tą samą aplikacją. Miejscem styku są wyrażenia BindingExpression w kodzie XAML. Niestety, czasami styku nie ma, albo wręcz robią się zwarcia i trzeba na to jakoś zareagować.

Jeśli twoje BindingExpression zawierają błędy (literówki, nieprawidłowy DataContext, brakujące właściwości itd) to aplikacja nadal będzie działać, bez crash’a, nie zobaczysz nawet MessageBox. Błędy zauważysz albo w UI, że coś nie działa jak powinno, albo podczas debugowania, w Visual Studio, w oknie Output znajdziesz odpowiedni zapisek.

BindingExpressionErrorInOutput

Silverlight 5

Od Silverlight 5 pojawiła się nowość – można wstawić breakpoint’a w XAML’u tak gdzie coś bindujesz, a następnie w oknie Locals przeglądać DataContext i wyczajać jaki faktycznie obiekt jest Bindowany.

Windows Store

Okazuje się, że najnowsza platforma oparta o język XAML nie zezwala na debugowanie BindingExpression w ten sposób (mam na myśli breakpointy), czyli wracamy kilka lat wstecz. Ale wczoraj odkryłem coś niesamowitego…

DebuggerSettings.BindingFailed

W Windows Runtime w klasie Application (App.xaml.cs – a więc każda aplikacja) jest właściwość DebuggerSettings klasy o tej samej nazwie, a klasa ta z kolei posiada zdarzenie BindingFailed. Cały czad polega na tym, aby wpiąć się w to zdarzenie i czekać… aż będą leciały błędy w BindingExpression.

public App()
{
    InitializeComponent();
    Suspending += OnSuspending;

	DebugSettings.BindingFailed += DebugSettings_BindingFailed;
}

Reakcja na błąd może być dowolna. Możesz zalogować, wyświetlić MessageBox’a a nawet wyświetlić notyfikację Toast.

private void DebugSettings_BindingFailed(object sender, BindingFailedEventArgs e)
{
	var dialog = new MessageDialog(e.Message, "BindingExpression Error");
	dialog.ShowAsync();
}

Efekt prezentuje się następująco:

SymulatorBindingExpressionErrorInMessageBox