Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Im Artikel “Von VBA zu C#: Objekt-Ereignisse” haben wir bereits die Grundlagen zur Programmierung und Implementierung benutzerdefinierter Ereignisse gelegt. Dies wollen wir nun ausbauen, indem wir uns zwei praktische Beispiele ansehen. Dabei wollen wir von einem Hauptfenster aus verschiedene Ansichten in einem Frame anzeigen, da-runter eine Kundenübersicht und eine Kundendetailansicht. Beim Anzeigen sollen verschiedene Dinge geschehen, die wir über die Implementierung von Ereignissen lösen wollen – und zwar über eingebaute sowie über benutzerdefinierte Ereignisse.
Beispielprojekt
Im Beispiel geht es um ein Hauptfenster, das über zwei Ribbon-Buttons verschiedene Page-Elemente in einem Frame anzeigen soll. Die Schaltfläche Kundenübersicht zeigt das Page-Objekt Kundenuebersicht an, die Schaltlfäche Neuer Kunde das Page-Objekt Kundendetails. Diese Seite wird ebenfalls aufgerufen, wenn der Benutzer doppelt auf einen der Einträge der Kundenübersicht klickt (siehe Bild 1).
Bild 1: Interaktion zwischen den einzelnen Seiten
Im ersten Beispiel wollen wir dafür sorgen, dass eine dritte Ribbon-Schaltfläche zum Löschen von Elementen der Kundenübersicht nur aktiviert wird, wenn die Kundenübersicht angezeigt wird. Das heißt, dass diese Schaltfläche deaktiviert werden soll, wenn eine andere Ansicht als die Kundenübersicht erscheint. Dazu wollen wir ein Ereignis implementieren, das beim Seitenwechseln im Frame-Element ausgelöst wird.
Im zweiten Beispiel wollen wir zwei eigene Events programmieren und implementieren. Die Kundenübersicht soll nicht jedes Mal, wenn der Benutzer von einer anderen Seite zurück auf diese Seite wechselt, neu erstellt werden beziehungsweise ihre Daten neu aus der Datenbank einlesen. Dies soll nur geschehen, wenn entweder einer der angezeigten Einträge auf der Seite Kundendetails geändert oder ein neuer Eintrag hinzugefügt wurde. Dazu wollen wir ein Ereignis in der Code behind-Klasse der Seite Kundendetails programmieren, die wir dann in der Code behind-Klasse des MainWindow-Objekts implementieren.
So können wir dann direkt im MainWindow den relevanten Code ausführen und müssen nicht von der untergeordneten Seite mit den Kundendetails auf das übergeordnete Fenster zugreifen – den Hintergrund erläutern wir weiter unten.
Eingebaute Events nutzen
Im ersten Beispiel wollen wir also ein Ribbon-Steuerelement im MainWindow aktivieren oder deaktivieren, je nachdem welches Page-Element das Frame-Element anzeigt. Wenn es die Seite Kundenuebersicht anzeigt, soll die Schaltfläche btnKundeLoeschen aktiviert werden, wenn es eine andere Seite anzeigt, soll der Benutzer diese Schaltfläche nicht anklicken können.
Dazu legen wir für das Frame-Element im XAML-Code, also in der Klasse MainWindow.xaml, das Attribut Navigated an und füllen es mit dem Wert WorkZone_Navigated:
<Window x:Class="Bestellverwaltung.MainWindow" ... Title="MainWindow" Height="450" Width="525"> <Grid> ... <Frame x:Name="WorkZone" Grid.Row="1" Navigated="WorkZone_Navigated"></Frame> </Grid> </Window>
Für dieses Ereignis hinterlegen wir die folgende Methode in der Code behind-Datei von MainWindow:
private void WorkZone_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) { switch (WorkZone.Content.ToString()) { case "Bestellverwaltung.Kundenuebersicht": btnKundeLoeschen.IsEnabled = true; break; default: btnKundeLoeschen.IsEnabled = false; break; } }
Diese Methode wird nun beim Wechseln des im Frame-Objekts angezeigten Objekts ausgelöst. Mit einer switch-Bedingung prüfen wir den Namen des angezeigten Elements, hier mit der Eigenschaft Content ermittelt. Hat diese den Wert Bestellverwaltung.Kundenuebersicht, stellt die Methode den Wert der Eigenschaft IsEnabled des Elements btnKundeLoeschen auf true ein. Für jeden anderen Inhalt erhält IsEnabled den Wert false.
Was ist nun der Unterschied zu den Ereignissen etwa einer Schaltfläche, die wir nun schon in vielen Beispielen implementiert haben In den bisherigen Beispielen haben wir meist selbst die Ereignisse ausgelöst, zum Beispiel durch einen Mausklick auf eine Schaltfläche. Diesmal wurde das Ereignis indirekt durch unsere Aktion ausgelöst, nämlich durch einen Klick auf eine Ribbon-Schaltfläche, die wiede-rum den Inhalt des Frame-Objekts geändert hat. Und das hat dann unser hier implementiertes Ereignis hervorgerufen.
Benutzerdefinierte Events
Wie oben gezeigt, gibt es eine große Anzahl eingebauter Ereignisse, die Sie für Ihre Zwecke nutzen können. Nicht immer jedoch werden Ereignisse zum gewünschten Zeitpunkt ausgelöst. Ein Beispiel ist das Speichern eines Kunden, der neu angelegt oder geändert wurde. Unter Access, wo alles auf die Anzeige und Bearbeitung von Daten ausgelegt ist, finden Sie entsprechende Ereignisse zuhauf – zum Beispiel das Ereignis Nach Aktualisierung. Unter WPF/C# sorgen wir selbst dafür, dass die Änderungen an den angezeigten Daten auch in die Datenbank geschrieben werden. Dementsprechend müssen wir auch selbst Ereignisse definieren, die zu einem solchen Zeitpunkt ausgelöst werden.
In unserem Fall wollen wir ein solches Ereignis nutzen, um festzulegen, ob eine Änderung oder eine Neuanlage eines Kunden erfolgt ist. Abhängig davon soll die Kundenübersicht, wenn sie das nächste Mal eingeblendet wird, entweder neu erzeugt werden (falls Änderungen vorliegen) oder mit den alten Daten eingeblendet werden.