Es ist technisch möglich, in das übergeordnete Steuerelement zu gelangen und den Weg mit den Steuerelementen zu finden, aber es macht Code sehr schwer zu pflegen, weil Sie Code in ändern, wenn Sie die Struktur des übergeordneten Steuerelements ändern alle enthaltenen Seiten. Das würde als sehr eng gekoppeltes Design betrachtet und ist oft fragil.
Ein somehwat cleaner design würde sein, dass Ihre Seitenklassen ein Ereignis auslösen, wenn die Save-Taste gedrückt wird. Dann kann Ihr übergeordneter Rahmen das Ereignis versenken und aktualisieren, was nach einer Speicheroperation aktualisiert werden muss. Das ist einfacher zu warten, weil Ihre Komponenten weniger miteinander verbunden sind, aber es bringt immer noch viel Datenbankwissen in Ihre GUI-Komponenten. Solch ein Design könnte für eine relativ einfache App geeignet sein, von der Sie nicht erwarten, dass Sie viel Pflege oder zukünftige Erweiterungen vornehmen.
Das Entwurfsmuster, das ich bevorzuge (wie viele Entwickler), besteht darin, die Datenbankbehandlung und Geschäftslogik in einer oder mehreren Klassen mit einer einfachen programmatischen Schnittstelle zu isolieren, die leicht getestet werden kann. Die GUI-Komponenten werden so einfach und dünn wie möglich gehalten, sodass sie bei Bedarf leicht geändert werden können. Dies wird oft als Model-View-Controller-Muster bezeichnet, aber es gibt andere Namen dafür. In Ihrem Beispiel enthält die Klasse "controller", die Ihre Geschäftslogik kapselt, Eigenschaften und Methoden zum Lesen und Festlegen von Informationen sowie eine "Speichern" - oder "Commit" -Methode, die Änderungen in eine Datenbank schreibt. Sobald der Speichervorgang abgeschlossen ist, wird ein "Gespeichertes" oder "Geändert" -Ereignis ausgelöst, das alle Steuerelemente ("Ansichten") benachrichtigt, die Informationen zu den geänderten Informationen anzeigen, und sie werden basierend auf den neuen Werten der Eigenschaften der Controller-Klasse aktualisiert .
Dank Jay, das ist ein interessanter Ansatz. Ich verwende Geschäftsobjekte mit einer Datenzugriffsebene, sodass ich die Aktualisierung von dort aus initiieren kann. Ich hatte jedoch gehofft, dass WPF eine einfache Möglichkeit bieten würde, auf die Elternsteuerung zuzugreifen, aber vielleicht bin ich zu optimistisch! – Mitch