Announcement

Collapse
No announcement yet.

WPF Programm stürzt beim Wechsel der Tab-Seite ab

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WPF Programm stürzt beim Wechsel der Tab-Seite ab

    Ein WPF-Programm mit mehreren Tab-Seiten, in denen DataGrids dargestellt sind stürzt beim Wechsel zu einer anderen Seite oder beim Aufruf einer neuen Seite ab. Vorausgesetzt, im DataGrid wurde eine Zeile selektiert. In dem DataGrid ist IsReadOnly="True" gesetzt.


    System.NullReferenceException wurde nicht behandelt.
    HResult=-2147467261
    Message=Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    StackTrace: eine lange Liste und ganz am Ende:

    bei Programmname.App.Main() in C:\Users\....\obj\x86\Debug\App.g.cs:Zeile 0.

    diese Zeile 0 sieht so aus:
    #pragma checksum "..\..\..\App.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "2F03BBD0639489A77D5C50B3D727094A"

    Visual Studio 2010 Express, Grundaufbau entsprechend:
    Das Model-View-ViewModel (MVVM) Entwurfsmuster für WPF


    Mit dem Debugger kann ich die Absturzstelle nicht finden.
    Wie kann ich den Fehler lokalisieren?

    Danke - Günther
    Günther

  • #2
    Das sollte im Stacktrace stehen, wo der Fehler aufgetreten ist.
    Christian

    Comment


    • #3
      Klar, App.g.cs ist ja da, wo das Programm anfängt. Aber sonst ist im Stacktrace keine Stelle aus meinem Quelltext aufgeführt. Der komplette Stacktrace ist zu lang, deshalb nur die obersten Zeilen. Wenn das nicht reicht, kann ich ja eine Zip-Datei hochladen, falls es Dir nützt:

      StackTrace:
      bei MS.Internal.Data.PropertyPathWorker.DetermineWheth erDBNullIsValid(Object item)
      bei MS.Internal.Data.PropertyPathWorker.DetermineWheth erDBNullIsValid()
      bei MS.Internal.Data.PropertyPathWorker.get_IsDBNullVa lidForUpdate()
      bei MS.Internal.Data.ClrBindingWorker.get_IsDBNullVali dForUpdate()
      bei System.Windows.Data.BindingExpression.ConvertPropo sedValue(Object value)
      bei System.Windows.Data.BindingExpressionBase.UpdateVa lue()
      bei System.Windows.Data.BindingExpression.UpdateOverri de()
      bei System.Windows.Data.BindingExpressionBase.Update()
      bei System.Windows.Data.BindingExpressionBase.ProcessD irty()
      bei System.Windows.Data.BindingExpressionBase.Dirty()
      bei System.Windows.Data.BindingExpressionBase.SetValue (DependencyObject d, DependencyProperty dp, Object value)
      bei System.Windows.DependencyObject.SetValueCommon(Dep endencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
      bei System.Windows.DependencyObject.SetCurrentValueInt ernal(DependencyProperty dp, Object value)
      bei System.Windows.Controls.Primitives.Selector.Update PublicSelectionProperties()
      bei System.Windows.Controls.Primitives.Selector.Select ionChanger.End()
      bei System.Windows.Controls.Primitives.Selector.OnItem sChanged(NotifyCollectionChangedEventArgs e)
      bei System.Windows.Controls.DataGrid.OnItemsChanged(No tifyCollectionChangedEventArgs e)
      bei System.Windows.Controls.ItemsControl.OnItemCollect ionChanged2(Object sender, NotifyCollectionChangedEventArgs e)
      bei System.Collections.Specialized.NotifyCollectionCha ngedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
      bei System.Windows.Data.CollectionView.OnCollectionCha nged(NotifyCollectionChangedEventArgs args)
      bei System.Windows.Controls.ItemCollection.SetCollecti onView(CollectionView view)
      bei System.Windows.Controls.ItemCollection.SetItemsSou rce(IEnumerable value, Func`2 GetSourceItem)
      bei System.Windows.Controls.ItemsControl.OnItemsSource Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
      bei System.Windows.DependencyObject.OnPropertyChanged( DependencyPropertyChangedEventArgs e)
      bei System.Windows.FrameworkElement.OnPropertyChanged( DependencyPropertyChangedEventArgs e)
      bei System.Windows.DependencyObject.NotifyPropertyChan ge(DependencyPropertyChangedEventArgs args)
      bei System.Windows.DependencyObject.UpdateEffectiveVal ue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
      bei System.Windows.DependencyObject.InvalidateProperty (DependencyProperty dp, Boolean preserveCurrentValue)
      bei System.Windows.Data.BindingExpressionBase.Invalida te(Boolean isASubPropertyChange)
      Günther

      Comment


      • #4
        Ich glaub, hier müsste ich mich einklinken können:


        bei System.Windows.Controls.DataGrid.OnItemsChanged(No tifyCollectionChangedEventArgs e)
        Günther

        Comment


        • #5
          Nee, das Ereignis DataGrid.OnItemsChanged kann ich nicht abfangen.
          Überhaupt, in dem langen Stacktrace sehe ich nichts, was ich irgendwie abfangen kann...

          Das Programm hat lange funktioniert, und jetzt urplötzlich bei einer kleinen Erweiterung...
          Attached Files
          Günther

          Comment


          • #6
            Das sind die Wirrungen von Databinding. Außer der Zuweisung hast du vermutlich nichts gemacht. Wenn irgendwas an den gebunden Daten nicht stimmt knallt es halt in den ~magischen~ Interna so wie bei dir jetzt
            Wenn das schon mal ging solltest du dich fragen was du denn bei deiner kleinen Erweiterung gemacht hast. Das Binding bekommt von der Datenquelle in irgendeinem Feld eine Null wo er aber keine Null erwartet. Wenn deine kleine Änderung ein weitere Spalte im Grid war dann sollte der Zusammenhang offensichtlich sein

            Comment


            • #7
              Das passiert nicht nur da, wo ich vor Kurzem geändert habe, sondern auch bei Seiten die schon lange funktioniert haben und längere Zeit nicht geändert wurden.

              Auf einer Seite habe ich die Ereignisse UserControl_Unloaded und DataGrid_Unloaded abgefangen. Beim Aufruf einer neuen Seite, wenn ich keine Zeile im Grid markiert habe, kommt zuerst UserControl_Unloaded, dann DataGrid_Unloaded, und danach erscheint die neue Tabseite. Wenn ich zuvor eine Zeile selektiere, erscheint nichts von alledem, er stürzt direkt ab.

              Code:
                      private void UserControl_Unloaded(object sender, RoutedEventArgs e)
                      {
                          try
                          {
                              MessageBox.Show("UserControl_Unloaded");
              
                          }
                          catch (Exception ex)
                          {
                              MessageBox.Show(ex.Message);
                          }
                      }
              
              
                      private void DataGrid_Unloaded(object sender, RoutedEventArgs e)
                      {
              
                          try
                          {
                              MessageBox.Show("DataGrid_Unloaded");
              
                          }
                          catch (Exception ex)
                          {
                              MessageBox.Show(ex.Message);
                          }
                      }
              Dann habe ich ein weiteres Ereignis abgefangen: DataGrid_UnloadingRow. Beim Aufruf einer neuen Seite kommt dort zuerst die Exception "Die Verteilerverarbeitung wurde deaktiviert, es werden jedoch weiterhin Nachrichten verarbeitet" Dann erscheint für jede Zeile im Grid eine MessageBox. Und dann kommt es darauf an, ob eine Zeile markiert war. Wenn Ja, stürzt er jetzt ab, wenn Nein, zeigt er noch die beiden anderen Messagebox-Meldungen und dann die neue Seite. Danach nimmt er keinerlei Maus oder Tastatureingaben an und lässt sich nur über VS beenden.
              Günther

              Comment


              • #8
                Code:
                        <DataGrid Grid.Row="1" ItemsSource="{Binding Liste}" Margin="6"  SelectedItem="{Binding Item, Mode=TwoWay}" 
                                      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsReadOnly="True" SelectionMode="Single" />
                Den Code habe ich zig-fach in x Programmen, seit über 3 Jahren. Ist da was falsches dran?

                Wenn ich bei SelectedItem den Namen der Property auf einen nicht existierenden Namen ändere oder SelectedItem komplett aus dem XAML entferne, dann stürzt mein Programm beim Tab-Wechsel nicht mehr ab.

                Bisher tritt mein Problem nur in zwei Projekten auf. Ich frage mich, ob die anderen Programme solange funktionieren bis ich eine Lösung gefunden und überall eingebaut habe :-(
                Entweder werde ich über SelectedIndex gehen, oder aber mich komplett vom DataGrid trennen müssen.
                Günther

                Comment


                • #9
                  @Ralf: Die Felder werden aus MySQL Datenbanken gelesen. Felder mit null gibt es nicht, die wandle ich beim Einlesen in einen leeren String um. Da hatte es mir schon zu oft geknallt.

                  Meine kleine Änderung war, dass eine neue Tabseite für eine weitere Tabelle hinzugekommen ist.

                  Trotzdem Danke an Dich und auch an Christian.
                  Günther

                  Comment


                  • #10
                    Eins der gebundenen Felder heißt nicht zufällig Item ist aber gar kein Indexer?

                    Comment


                    • #11
                      SelectedItem="{Binding Item, Mode=TwoWay}"
                      Ist der Name Item etwa heimlich reserviert?
                      Innerhalb des Models benutze ich den Namen Item nicht.

                      Was ist ein Indexer? Das, was man mit SelectedIndex bindet?
                      Günther

                      Comment


                      • #12
                        Tatsächlich! Wenn ich den Namen Item ändere, ist der Spuk vorbei.
                        Ich hatte mir irgendwann Item angewöhnt, weil das beim Kopieren in neue ViewModels weniger Arbeitsaufwand ist.

                        Haben wir ja doch noch ein Happy End :-)
                        Danke!
                        Günther

                        Comment


                        • #13
                          Ein Indexer ist ein Property die den Array Operator darstellt und dann auch so angesprochen werden kann. In den Interna einer Liste (IList Abkömmlinge) heißt diese Property Item. Die Databinding Implementierung ist leider so clever denn Namen Item zu erkennen und dann davon ausgeht es ist eine Liste ohne zu prüfen ob die Klasse auch tatsächlich ILIst implementiert. Der Zugriff auf das erste Element in der angeblichen Liste geht dann in die Hose.
                          Zuletzt editiert von Ralf Jansen; 05.03.2014, 17:55.

                          Comment

                          Working...
                          X