Event zu früh gefeuert

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. :rolleyes:
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>
Der XamlCode

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;
            }
        }
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:
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!?
 
Meines Wissens doch ;)
Dieses Verhalten gibt es schon seit Vb4 oder früher? Ich hoffe jedenfalls das ich damit richtig liege ;).

Das Verhalten kannst im Debugger bei dem kleinen Projekt ja Schritt für Schritt durchgehen und dabei gut ein Käffchen trinken.

Naja auf Schönheit legste ja nicht soviel wert. Hier das wäre mein "schmutziger" schneller Lösungsansatz zu deinem Problem.

Code:
public partial class Window1 : Window
{

        private bool bInit;

        public Window1()
        {
            bInit = false;

            InitializeComponent();
            _wetter = this.FindResource("_wetter") as Wetter;

            bInit = true
        }

        private void _slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if ((sender as Slider).Value < 0 && binit == true)
            {
                //Hier kracht es weil _wetter null ist
                _wetter.AktuellerStatus = Temperaturstatus.Arschkalt;
            }
        }
}
 

Neue Beiträge

Zurück