Mam wiele warstw w aplikacji i uważam, że muszę wymyślać zdarzenia w warstwie GUI, wykonując zmiany paska stanu itp. . Muszę napisać wielokrotnie kodowane, gdzie każda warstwa po prostu subskrybuje zdarzenia z niższej warstwy, a następnie w wywołaniu po prostu wywołuję zdarzenie w łańcuchu. Czy jest to skuteczniejszy sposób na zrobienie tego?Bubbling up events.
Odpowiedz
Jeśli wszystko, co robisz, uruchamia procedurę obsługi zdarzeń z innej procedury obsługi zdarzeń, możesz wyciąć środkowego mężczyznę i podłączyć procedury obsługi zdarzeń bezpośrednio w blokach dodawania/usuwania wydarzenia.
Na przykład, jeśli masz UserControl z „SaveButtonClick” imprezy, a wszystko, co chcesz zrobić, gdy jest zadzwonić do obsługi zdarzeń, gdy „SaveButton” na UserControl kliknięciu, można to zrobić:
public event EventHandler SaveButtonClick
{
add { this.SaveButton.Click += value; }
remove { this.SaveButton.Click -= value; }
}
Teraz nie potrzebujesz żadnego kodu do wystrzelenia zdarzenia SaveButtonClick - zostanie on automatycznie uruchomiony, gdy zostanie wywołane zdarzenie SaveButton.Click (tj. Gdy ktoś kliknie ten przycisk).
Możesz mieć centralny kanał, który obsługuje tylko zdarzenia. Ten kanał musi być niezależny, aby warstwa mogła go tylko opublikować lub subskrybować.
To brzmi interesująco, ale wyjaśnienie jest bardzo niejasne. Czy możesz podać kilka przykładów? – spoulson
O ile nie widzę trochę więcej wzoru, trudno będzie podać dobrą odpowiedź.
WPF generuje zdarzenia baniek w górę (automatycznie) drzewa komponentów/kontrolek interfejsu użytkownika ... to zostało wbudowane w strukturę. Więc myślę, że to jest zalecany sposób :)
Problem z pominięciem środkowego człowieka Warstwa 2 polega na tym, że Layer1 i Layer3 teraz się znają ... są sprzężone. Więc jest to kompromisem .. jeśli jesteś w porządku ze sprzężeniem .. wyeliminuj środkowego mężczyznę/wymyśl wyspecjalizowany komponent z tą odpowiedzialnością. Jeśli jednak spodziewasz się, że warstwa 3 będzie się wymieniać na gorąco (low coupling), powiedziałbym, że kontynuuj bulgotanie.
Spójrz na Update Controls .NET. Kontrolki te wykrywają części modelu danych, od których zależą nawet przez warstwy logiki biznesowej. Nie musisz pisać żadnego kodu, aby je powiadomić.
Czytanie z bloga Jeremy'ego Millera "The Shade Tree Developer", szczególnie jego Write Your Own CAB series - rzeczy, o których mówi, to prawdopodobnie to, czego potrzebujesz.
Peter Rilling opublikował sposób symulacji Event Bubbling/Broadcasting w winformach. Jest to proste i skuteczne.
- 1. Bubbling up zdarzeń, które mają być subskrybowane
- 2. TKInter keypress, keyrelease events
- 3. VB6 Combo box events
- 4. Dojo: dojo onblur events
- 5. C# Generic Events
- 6. Process Complex Events
- 7. jQuery: bind namespaces events
- 8. Shadowing events in .NET
- 9. Aplikacja RESTful grails: DRY up up UrlMapping
- 10. Bubbling i przechwytywanie za pomocą addEventListener
- 11. Przykład Bubbling i przechwytywania w React.js
- 12. Delphi XE build events .. globalnie?
- 13. Symfony2 Form Events - Listy rozwijane
- 14. Scala: Odbieranie Server-Sent-Events
- 15. vagrant up issue
- 16. Jak obsługiwać przycisk "Up"?
- 17. Błąd Vagrant up Segfault
- 18. Speed Up czas pobierania
- 19. python3 messes up terminal
- 20. AirPlay messes up localhost
- 21. MVC-pop up window
- 22. Google maps infowindow events on open
- 23. pointer-events: brak VML rozwiązanie Raphael
- 24. PictureBox MouseEnter/MouseLeave Events not Firing
- 25. C# Hook Global Keyboard Events - .net 4.0
- 26. Jak zaimplementować Server Sent Events w PHP?
- 27. Jak profilować (debugować) ExtJS EventPipe/Events
- 28. Backbone.marionnette - Rebinding events vs Creating New View
- 29. Jak powiązać z s-up?
- 30. Przeciągnij pop-up kontroli WPF
To brzmi interesująco. Chciałbym zobaczyć wdrożenie. –
@Maxim - kod, który tam wysłałem * jest * implementacją. Jeśli masz UserControl za pomocą przycisku o nazwie SaveButton i upuszczasz ten UC na formularz, możesz zasubskrybować SaveButtonClick z formularza, a za każdym kliknięciem przycisku zostanie wywołana obsługa zdarzenia. –
Podoba mi się pomysł i łatwe wdrożenie. ale nie podoba mi się zależność, którą utworzysz pomiędzy kontrolką użytkownika a subskrybentem. –