| 

.NET C# Java Javascript Exception

4
Hallo zusammen,
um zu verhindern das durch Navigieren von einer Page zur anderen in einer WPF Page Daten verlorengehen möcht ich den NavigationService nutzen.
Ich habe dazu das Beispiel aud der Microsoft Dokumentation benuzt um mich beim NavigationService an und wieder abzumelden. Leider funktioniert das Abmelden nicht ( Fehlermeldung 'Object reference not set to an instance of an object' ).Hier der Code den ich verwende.
Also konkret in der Prozedur CancelNavigationPage_Unloaded der Aufruf :
this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);

löst den Fehler aus.
Wenn ich aber uaf das abmelden verzichte wird bei jedem Öffnen der Page eine weitere Aneldung getätigt die dazu führt das die Abfragen zum Speichern der Änderungen mehrfach erfolgen.

Für jede Idee wäre ich dankbar. ( wenn möglich mit einem kleinen Codebeispiel)

Gruß und Danke im Vorraus
asWorks


this.Loaded += new RoutedEventHandler(CancelNavigationPage_Loaded);
this.Unloaded += new RoutedEventHandler(CancelNavigationPage_Unloaded);


void CancelNavigationPage_Loaded(object sender, RoutedEventArgs e)
{
try
{
this.NavigationService.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);
}
catch (Exception)
{

MessageBox.Show("Subcribe from navigating failed.");
}

}

void CancelNavigationPage_Unloaded(object sender, RoutedEventArgs e)
{
try
{
this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);
}
catch (Exception ex)
{
ProjektDB.Temp.Output.WriteMessage(ex.Message);
MessageBox.Show("Unsubcribe from navigating failed.");
}

}


void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
{
// Wurden Daten geändert ?
if (CheckForChanges() == true)
{
MessageBoxResult result;
result = MessageBox.Show("Daten wurden gändert. Änderungen speichern ?", "Sicherheitsabfrage", MessageBoxButton.YesNoCancel);

if (result == MessageBoxResult.Cancel) e.Cancel = true;
if (result == MessageBoxResult.Yes) db.SaveChanges();

}
}
News:
11.12.2011
asWorks 45 3
Hallo asWorks, anscheind konnte ffordermaier dein Problem lösen. Er würde sich bestimmt freuen, wenn du seine Antwort auch als Lösung akzeptierst. Grüße
Nicolai Schönberg 12.12.2011
Hallo Nicolai,
soeben geschehen. Dieses Prozedere war mir nicht bekannt.

Gruß
asWorks
asWorks 12.12.2011
1 Antwort
2
Hallo asWorks,

die NavigationService-Property scheint beim Unloaded Event nicht mehr gesetzt zu sein. Ursache hierfür kenne ich nicht, aber wenn Du Dir den NavigationService in einem Member zwischenspeicherst, sollte die Abmeldung funktionieren.

// member...
private NavigationService ns;

// loaded event...
ns = this.NavigationService;
ns.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);

// unloaded event...
ns.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);

Viel Erfolg
Florian
12.12.2011
ffordermaier 4,7k 2 8
1
PS: Das += new und -= new kann man sich seit .net 2.0 sparen. Es reicht += / -= NavigationService_Navigating. Sieht auch irgendwie hübscher aus als -= new ... Gruß
Nicolai Schönberg 12.12.2011
1
Gute Ergänzung! Ich wollte nur möglichst nah am urspr. Code bleiben. Noch hübscher sind ReactiveExtensions, ist nen Blick wert, wenn Du's noch nicht kennen solltest.
ffordermaier 12.12.2011
Ui nein ReactiveExtensions kannte ich noch nicht, sieht auf den ersten Blick ganz schick aus. Muss ich mal mit rumspielen, danke!
Nicolai Schönberg 12.12.2011
Hallo Florian,
so geht´s. Danke für den Tipp. Auch allen Anderen für die Ergänzungen.
Gruß
asWorks
asWorks 12.12.2011

Stelle deine .net-Frage jetzt!