BackgroundWorker
Grünschnabel
Ich habe das Problem dass während "InitializeComponent()" ein Event gefeuert und dadbei in der Codebehind-Datei auf ein noch nicht initialisiertes Objekt zugegriffen wird.
=> NullReferenceException
Hier mal ein Minimalbeispiel. Und bitte keine Diskussionen über den Sinn dieses Beispiels.
Der XamlCode
Codebehind
Das Problem ist eben dass die Resource gar nicht erst zugewiesen wird.
Lösungsansatz 1:
Die Resource VOR der Initialisierung in der Codebehind-Datei zuweisen anstatt im XAML-Code:
Lösungsansatz 2:
Das Event des Slider erst nach der Initialisierung einhängen:
Also man bekommt es schon zum Laufen.
Aber gibts da schönere Lösungen und warum braucht man überhaupt eine Lösung?
Ich hänge doch das Event im XAML-Code ja erst ein nachdem ich das Value-Property geändert habe.
Somit sollte doch beim Initialisieren gar kein Event gefeuert werden!?
=> NullReferenceException
Hier mal ein Minimalbeispiel. Und bitte keine Diskussionen über den Sinn dieses Beispiels.
Code:
<Window.Resources>
<local:Wetter x:Key="_wetter" />
</Window.Resources>
<StackPanel>
<Slider Name="_slider"
Minimum="-20"
Maximum="30"
Value="-5"
ValueChanged="_slider_ValueChanged">
</Slider>
</StackPanel>
Code:
private Wetter _wetter;
public Window1()
{
InitializeComponent();
_wetter = this.FindResource("_wetter") as Wetter;
}
private void _slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if ((sender as Slider).Value < 0)
{
//Hier kracht es weil _wetter null ist
_wetter.AktuellerStatus = Temperaturstatus.Arschkalt;
}
}
Das Problem ist eben dass die Resource gar nicht erst zugewiesen wird.
Lösungsansatz 1:
Die Resource VOR der Initialisierung in der Codebehind-Datei zuweisen anstatt im XAML-Code:
Code:
public Window1()
{
_wetter = new Wetter();
this.Resources.Add("_wetter", _wetter);
InitializeComponent();
}
Lösungsansatz 2:
Das Event des Slider erst nach der Initialisierung einhängen:
Code:
public Window1()
{
InitializeComponent();
_wetter = this.FindResource("_wetter") as Wetter;
_slider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(_slider_ValueChanged);
}
Also man bekommt es schon zum Laufen.
Aber gibts da schönere Lösungen und warum braucht man überhaupt eine Lösung?
Ich hänge doch das Event im XAML-Code ja erst ein nachdem ich das Value-Property geändert habe.
Somit sollte doch beim Initialisieren gar kein Event gefeuert werden!?