WPF: Ladění data bindingu
Pokud binding píšete ručně přímo v XAMLu, určitě mi dáte za pravdu, že se občas překlepnete nebo přehlédnete a binding prostě nefunguje. O tom, jak ladit data binding ve WPF vyšlo už poměrně hodně článků např. How can I debug WPF bindings? od Bea Stollnitze, který popisuje několik technik ladění.
Nejvíce se mi osvědčilo nadění pomocí Converteru. Converter je třída, která je zděděná z IValueConverter a můžeme pomocí něho udělat jakousi transformaci dat na požadované datové typy. Jako jeden z příkladů budiž projekt WPF Converters na CodePlexu, který obsahuje poměrně velké množství v praxi hodně užitečných konvertorů.
Můj Converter pro ladění vypadá takto:
public class DebugConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
System.Diagnostics.Debugger.Break();
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
System.Diagnostics.Debugger.Break();
return value;
}
}
Princip je jednoduše takový, aby při konverzi hodnoty vyskočila výjimka. Potom si můžeme ve Visual Studiu prohlédnout hodnotu, která by se konvertovala v parametru value.
Pokud by k výjimce vůbec nedošlo, znamená to, že se Converter nepoužil a tím pádem se pravděpodobně jedná o překlep v názvu vlastnosti (Property), kterou chceme svázat bindingem.
Použití Converteru je velmi jednoduché, je potřeba ho jenom přidat do Resource, abychom ho mohli použít jako StaticResource:
<Window.Resources>
<DebugConverter x:Key="DebugConv" />
</Window.Resources>
A potom použít v bindingu, který chceme prověřit:
<Label Content="{Binding ElementName=myTextBox, Path=Text, Converter={StaticResource DebugConv}}" />
A motivační poznámka na závěr. Vytvořit tento ladící Converter zabere opravdu mnohem méně času než metodou pokus omyl zjišťovat, kde je chyba. (Vlastní zkušenost) :)