Je moet je goed bewust zijn van wat er kan gebeuren als je event handlers koppelt in xaml.
De volgorde van het parsen van de controls gebeurt adhv de volgorde van definitie in het xaml document.
Het is dus goed mogelijk dat je in de code van een eventHandler verwijst naar een control die op dat moment nog helemaal niet bestaat.
Als voorbeeld pakken we de comboBox.
De xaml:
<StackPanel>
<ComboBox IsSynchronizedWithCurrentItem="True" Margin="56,57,73,0" VerticalAlignment="Top" Height="29"
SelectionChanged="comboBox1_SelectionChanged" SelectedIndex="0">
<ComboBoxItem Content="1"/>
<ComboBoxItem Content="2"/>
</ComboBox>
<Label Content="blub" Name="LaterLabel" />
</StackPanel>
En de code behind:
private void comboBox1_SelectionChanged(object sender, RoutedEventArgs ea)
{
LaterLabel.Content = "maakt niet uit";
}
Door het specificeren van de SelectedIndex property, gaat het SelectionChanged event meteen af.
En de eerste keer bij het renderen van dat control bestaat de label nog niet. Dus je krijgt een Null ref exception.
Mogelijke oplossingen (in volgorde van mijn persoonlijke voorkeur):
- Checken of de control null is (dit zou eigenlijk altijd moeten)
- De SelectedIndex zetten na de InitializeComponent() in de constructor
- Het event in code koppelen na de InitializeComponent() in de constructor
- De label control eerder definieren in xaml
Overigens is dit geen bug. Het is gewoon een valkuil waar je rekening mee moet houden. (net als bij Asp.Net)
Dit stuk is gebaseerd op het artikel van Josh Smith