2013-08-26 18 views
5

Nel costruttore MainWindow, sto registrando un gestore di eventi: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"); 
     } 
    } 
} 

Ma in PageViewDocText, NewPageIRPRO è nullo

Che cosa sto facendo di sbagliato?
Da PageViewDocText, voglio chiamare MainWindow.ViewIPRO.

Questo evento si attiva gestore ed è registrata la riga seguente pageViewDocText.NewPageIRPRO + =

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

Fa il PageViewDocText' costruttore di fuoco 'quell'evento? È semplice eseguire il debug; basta guardare lo stack delle chiamate. Non c'è modo che l'evento sia nullo dopo l'abbonamento a meno che non abbia omesso il codice incriminato. –

+1

Penso che sia necessario mostrarci la riga di codice in cui si rileva che 'NewPageIRPRO' è nullo. –

+0

@ Eds. Nessun gestore di eventi pulsante attiva questo evento. Sono perso perché il gestore di eventi è vuoto anche. In GabeLib (una classe pura) uso il gestore di eventi che sembra essere allo stesso modo e funziona perfettamente. – Paparazzi

risposta

1

Sembra che si sta chiamando un evento da un'altra classe (non quotata) e c'è un delegato mancante.

provare questo codice:

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

Non seguo. btn_PageBreakNext è un gestore di eventi per un pulsante sulla pagina e non viene chiamato da alcuna pagina o classe. – Paparazzi

+0

Ho creato un progetto di esempio con il delegato dell'evento creato in un'altra classe simile al codice e sembra sempre funzionare. Quindi, penso che il tuo codice sia corretto. Poiché NewPageIRPRO è nullo, ciò indica che potrebbe trattarsi di un'istanza diversa di PageViewDocText e non della stessa istanza creata da MainWindow. Suggerisco di posizionare il delegato DocEventHandler nel costruttore di PageViewDocText. per esempio. PageViewDocText (SearchCls.DocEventHandler NewPageIRPRO) {this.NewPageIRPRO = NewPageIRPRO; }. Questo dovrebbe impedire a qualsiasi istanza di essere creata senza il gestore. – sharpguru

+0

Ancora lavorando su di esso. E sono d'accordo con i tuoi commenti. Sembra che ci siano due oggetti PageViewDocText là fuori. Inserendo DocEventHandler nel Ctor si risolverebbe il problema, ma voglio capire perché ce ne sono due. – Paparazzi

Problemi correlati