2013-08-26 14 views
5

Im MainWindow Konstruktor Ich melde mich einen Event-Handler: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"); 
     } 
    } 
} 

Aber in PageViewDocText, NewPageIRPRO ist null

Was mache ich falsch?
Von PageViewDocText möchte ich MainWindow.ViewIPRO anrufen.

Dieser Event-Handler ausgelöst und die folgende Zeile pageViewDocText.NewPageIRPRO registriert + =

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

der 'PageViewDocText' Konstruktor Feuer, das Ereignis wird? Dies ist einfach zu debuggen; Sehen Sie sich den Call-Stack an. Es gibt keine Möglichkeit, dass das Ereignis nach dem Abonnement ungültig ist, es sei denn, Sie haben den fehlerhaften Code nicht angegeben. –

+1

Ich denke, Sie müssen uns die Codezeile zeigen, in der Sie 'NewPageIRPRO' auf Null setzen. –

+0

@EdS. Kein Ereignishandler für Schaltflächen löst dieses Ereignis aus. Ich bin verloren, warum der Event-Handler auch leer ist. In GabeLib (eine reine Klasse) benutze ich Event-Handler, was scheint die gleiche Art und es funktioniert gut. – Paparazzi

Antwort

1

Sieht aus wie Sie ein Ereignis aus einer anderen Klasse aufrufe (nicht aufgeführt), und es ist ein fehlend Delegierten.

diesen Code Versuchen:

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

Ich folge nicht. btn_PageBreakNext ist ein Ereignishandler für eine Schaltfläche auf der Seite und wird von keiner Seite oder Klasse aufgerufen. – Paparazzi

+0

Ich habe ein Beispielprojekt erstellt, bei dem der Ereignisdelegat in einer anderen Klasse erstellt wurde, die Ihrem Code ähnelt, und es scheint immer zu funktionieren. Also, ich denke dein Code ist korrekt. Da NewPageIRPRO null ist, bedeutet das für mich, dass es sich um eine andere Instanz von PageViewDocText und nicht um dieselbe Instanz handeln könnte, die von MainWindow erstellt wurde. Ich schlage vor, den DocEventHandler-Delegaten in den Konstruktor von PageViewDocText zu platzieren. z.B. PageViewDocText (SearchCls.DocEventHandler NewPageIRPRO) {this.NewPageIRPRO = NewPageIRPRO; }. Dies sollte verhindern, dass eine Instanz ohne den Handler erstellt wird. – sharpguru

+0

Arbeitet noch daran. Und ich stimme Ihren Kommentaren zu. Es scheint, dass es dort zwei PageViewDocText-Objekte gibt. Wenn Sie den DocEventHandler im ctor platzieren, würde das Problem behoben, aber ich möchte herausfinden, warum es zwei gibt. – Paparazzi