2008-10-20 15 views
23

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

29

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).

+0

To brzmi interesująco. Chciałbym zobaczyć wdrożenie. –

+0

@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. –

+0

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. –

0

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ć.

+1

To brzmi interesująco, ale wyjaśnienie jest bardzo niejasne. Czy możesz podać kilka przykładów? – spoulson

1

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.

0

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ć.

3

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.