tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
607
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    BackgroundWorker BackgroundWorker ist offline Mitglied
    Registriert seit
    Aug 2009
    Beiträge
    11
    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.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      <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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
        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 :
    1
    2
    3
    4
    5
    6
    7
    
            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 :
    1
    2
    3
    4
    5
    6
    
            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!?
     

  2. #2
    Jantz Jantz ist offline Mitglied Gold
    Registriert seit
    Aug 2003
    Beiträge
    207
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    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;
                }
            }
    }
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 09.04.10, 10:49
  2. jQuery: out-Event wird gefeuert aber nicht ausgeführt
    Von Avorin im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 03.01.10, 22:23
  3. mousup-event erzeugt vorher paint-event.Wie abstellen?
    Von Cheesygecko im Forum .NET Windows Forms
    Antworten: 0
    Letzter Beitrag: 09.01.09, 14:04
  4. Sound fängt zu früh an
    Von timäää im Forum Flash Plattform
    Antworten: 6
    Letzter Beitrag: 03.03.05, 13:13
  5. Audio kommt zu früh
    Von arminw im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 19.08.04, 19:28