Silverlight: „Element ist bereits das untergeordnete Element…“

Ich hatte gerade 2 Stunden Debugging hinter mir und wollte aufgrund der Einfachheit der Lösung alle codingfreaks-Leser an meiner Erkenntnis teilhaben lassen.

Einführung

Was war passiert? Ich habe eine Silverlight-App mit MVVM geschrieben. Alles läuft super. Auf dem Main-Dialog wird eine Animation gezeigt, solange das ViewModel sagt, dass es busy ist (IsBusy-Property mit INotifyPropertyChanged). Im XAML habe ich dazu zwei VisualStates erstellt, die per GotoStateAction angestoßen werden sollen. Der Anstoß erfolgt per DataTrigger statt ElementTrigger (Wer jetzt nicht mehr mitkommt, der braucht nicht weiter zu lesen, denn er nutzt die Technik einfach nicht ;-)).

Was passiert also? Zunächst einmal nichts!!! Ich bekomme keinen Fehler! Nach F5 im Visual Studio startet mein Firefox fröhlich vor sich hin und die Busy-Animation läuft und läuft. Ich suche und suche und finde einfach nichts. Zuerst habe ich die Services im Verdacht, aber aus einer Konsolen-Anwendung heraus laufen sie einwandfrei.

Irgendwann steppe ich per F11 durch meinen Code und plötzlich kommt der Haltepunkt an folgenden Punkt:


private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
 // Wenn die Anwendung außerhalb des Debuggers ausgeführt wird, melden Sie die Ausnahme mithilfe
 // des Ausnahmemechanismus des Browsers. In IE wird hier ein gelbes Warnsymbol in der
 // Statusleiste angezeigt, Firefox zeigt einen Skriptfehler an.
 if (!System.Diagnostics.Debugger.IsAttached)
 {

 // Hinweis: So kann die Anwendung weiterhin ausgeführt werden, nachdem eine Ausnahme ausgelöst, aber nicht
 // behandelt wurde.
 // Bei Produktionsanwendungen sollte diese Fehlerbehandlung durch eine Anwendung ersetzt werden, die
 // den Fehler der Website meldet und die Anwendung beendet.
 e.Handled = true;
 Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
 }
}

Aha! Also kommt doch eine Exception! Wie kann man jetzt an den Inhalt kommen? Entgegen der Verlautbarung im Kommentar erscheint nämlich kein Hinweis im Firefox. Also Firebug als AddOn im FireFox installieren und im Tab „Konsole“ selbige aktivieren, dann noch die Option „Bei allen Fehlern anhalten“ aktiviren und Refresh drücken:

Das Ergebnis war folgendes:

Das Problem ist, dass dieser Fehler so gut wie alles bedeuten kann. Offensichtlich ist das ganze eine Standard-Fehlermeldung, die Silverlight immer dann nimmt, wenn es so richtig kracht.

Erkenntnis

Nach einigem Googeln und Raten kam ich dann endlich auf die Lösung. Taucht diese Fehlermeldung in Verbindung mit dem VisualStateManager auf, dann bedeutet dies prinzipiell immer, dass innerhalb der VisualStates auf ein Element verwiesen wird, das es unter diesem Namen nicht mehr gibt.

Da kam die Erkenntnis: Ich hatte das Holder-Grid mit den Busy-Elementen wirklich umbenannt. Da ich das aber im Visual Studio und nicht in Blend gemacht hatte, fiel der Fehler nicht auf. Öffnet man das Projekte nämlich mit dem Fehler in Blend, meckert der Designer sofort rum, dass der VisualState nicht geladen werden kann:

Das ist doch schon besser!

Man kann die vom FireBug angezeigte Fehlermeldung übrigens auch in Visual Studio provozieren, indem man sich mit dem Debugger an den Firefox-Prozess anhängt und einen Haltepunkt an folgende Stelle im ViewModel setzt:

Dann bekommt man die Exception sofort geliefert. Aussagekräftiger wird sie dadurch natürlich auch nicht.

Fazit

Es wird endlich Zeit, dass das XAML-Debugging (Silverlight 5) zum Release kommt. Derzeit macht man immer wieder solche Blindflüge, weshalb Jon Papa bei seiner Präsentation auf der Firestarter-Keynote von Scott Guthrie ja auch heftigen Applaus beim Zeigen des XAML-Debuggers bekam.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.