2013-08-26 16 views
5

W konstruktorze MainWindow, ja rejestracji programu obsługi zdarzeń:Event Handler Null

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     pageViewDocText = new PageViewDocText(); 
     framePageDocFieldDetail.Content = pageViewDocText; 
     pageViewDocText.NewPageIRPRO += new GabeLib.SearchCls.DocEventHandler(ViewIPRO); 
    } 

    protected void ViewIPRO(string IRPOlink) // ... 
} 

public partial class PageViewDocText : Page, INotifyPropertyChanged 
{ 
    public event GabeLib.SearchCls.DocEventHandler NewPageIRPRO; 

    private void btn_PageBreakNext(object sender, RoutedEventArgs e) 
    { 
     // this fires but NewPageIRPRO is null 
     if (NewPageIRPRO != null) 
     { 
      NewPageIRPRO("dummylink"); 
     } 
    } 
} 

Ale w PageViewDocText, NewPageIRPRO jest null

Co robię źle?
Od PageViewDocText, chcę zadzwonić pod numer MainWindow.ViewIPRO.

To zdarzenie pożary przewodnika i jest zarejestrowany linię poniżej pageViewDocText.NewPageIRPRO + =

App.StaticGabeLib.Search.NewDocIRPRO += new GabeLib.SearchCls.DocEventHandler(ViewIPRO); 
+3

Czy 'PageViewDocText' konstruktor pożar zdarzenie? To jest łatwe do debugowania; po prostu spójrz na stos wywołań. Nie ma możliwości, aby wydarzenie miało wartość zerową po subskrypcji, chyba że pominiesz kod naruszający prawa. –

+1

Myślę, że musisz pokazać nam linię kodu, w której wybierzesz 'NewPageIRPRO' mającą wartość null. –

+0

@EdS. Żadna funkcja obsługi zdarzeń przycisku nie uruchamia tego zdarzenia. Nie mam pojęcia, dlaczego obsługa zdarzeń jest pusta. W GabeLib (czystej klasie) używam programu obsługi zdarzeń, który wydaje się być taki sam i działa dobrze. – Paparazzi

Odpowiedz

1

Wygląda dzwonisz zdarzenie z innej klasy (nie wymienione) i jest brakującym delegat.

Spróbuj kod:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     pageViewDocText = new PageViewDocText(); 
     framePageDocFieldDetail.Content = pageViewDocText; 
     pageViewDocText.PageBreakNext += new PageBreakNext(ViewIPRO); 
    } 

    protected void ViewIPRO(string IRPOlink) // ... 
} 

public partial class PageViewDocText : Page, INotifyPropertyChanged 
{ 
    public delegate void PageBreakNext(string IRPOlink); 
    public event PageBreakNext PageBreak; 

    private void btn_PageBreakNext(object sender, RoutedEventArgs e) 
    { 
     // this fires but NewPageIRPRO is null 
     if (PageBreak != null) 
     { 
      PageBreak("dummylink"); 
     } 
    } 
} 
+0

Nie podążam. btn_PageBreakNext jest programem obsługi zdarzeń dla przycisku na stronie i nie jest wywoływany przez żadną stronę ani klasę. – Paparazzi

+0

Utworzono przykładowy projekt z delegatem wydarzenia utworzonym w innej klasie podobnej do kodu i zawsze wydaje się działać. Więc myślę, że twój kod jest poprawny. Ponieważ NewPageIRPRO ma wartość null, oznacza to, że może to być inna instancja klasy PageViewDocText, a nie to samo wystąpienie utworzone przez MainWindow. Proponuję umieszczenie delegata DocEventHandler w konstruktorze PageViewDocText. na przykład PageViewDocText (SearchCls.DocEventHandler NewPageIRPRO) {this.NewPageIRPRO = NewPageIRPRO; }. Powinno to zapobiec tworzeniu się instancji bez obsługi. – sharpguru

+0

Nadal nad nim pracuję. Zgadzam się z Tobą w komentarzach. Wygląda na to, że istnieją tam dwa obiekty PageViewDocText. Umieszczenie DocEventHandler w ctor rozwiązałoby to, ale chcę się dowiedzieć, dlaczego są dwa. – Paparazzi