2013-08-26 32 views
5

Trong constructor MainWindow, tôi đăng ký một 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"); 
     } 
    } 
} 

Nhưng trong PageViewDocText, NewPageIRPRO là null

Tôi đang làm gì sai?
Từ PageViewDocText, tôi muốn gọi MainWindow.ViewIPRO.

Sự kiện này cháy xử lý và được đăng ký dòng dưới đây pageViewDocText.NewPageIRPRO + =

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

Liệu các 'PageViewDocText' constructor lửa sự kiện đó? Điều này rất đơn giản để gỡ lỗi; chỉ cần nhìn vào ngăn xếp cuộc gọi. Không có cách nào mà sự kiện là null sau khi đăng ký trừ khi bạn đã bỏ qua mã vi phạm. –

+1

Tôi nghĩ bạn cần hiển thị cho chúng tôi dòng mã nơi bạn nhận 'NewPageIRPRO' là null. –

+0

@EdS. Không có trình xử lý sự kiện nút nào kích hoạt sự kiện đó. Tôi bị mất là tại sao xử lý sự kiện cũng trống rỗng. Trong GabeLib (một lớp thuần khiết), tôi sử dụng trình xử lý sự kiện có vẻ giống như cách và nó hoạt động tốt. – Paparazzi

Trả lời

1

Hình như bạn đang gọi một sự kiện từ một lớp (không niêm yết) và có một đại biểu thiếu.

Hãy thử mã này:

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

Tôi không theo dõi. btn_PageBreakNext là một trình xử lý sự kiện cho một nút trên trang và không được gọi bởi bất kỳ trang hoặc lớp nào. – Paparazzi

+0

Tôi đã tạo một dự án mẫu với đại biểu sự kiện được tạo trong một lớp khác tương tự như mã của bạn và nó luôn có vẻ hoạt động. Vì vậy, tôi nghĩ rằng mã của bạn là chính xác. Vì NewPageIRPRO là null cho biết rằng nó có thể là một thể hiện khác của PageViewDocText và không phải là cùng một cá thể được tạo bởi MainWindow. Tôi đề nghị đặt đại biểu DocEventHandler trong hàm tạo của PageViewDocText. ví dụ. PageViewDocText (SearchCls.DocEventHandler NewPageIRPRO) {this.NewPageIRPRO = NewPageIRPRO; }. Điều này sẽ ngăn chặn bất kỳ cá thể nào từ việc tạo ra mà không có trình xử lý. – sharpguru

+0

Vẫn đang làm việc trên đó. Và tôi đồng ý với bạn. Có vẻ như có hai đối tượng PageViewDocText ngoài đó. Đặt DocEventHandler trong ctor sẽ sửa lỗi đó nhưng tôi muốn tìm ra lý do tại sao có hai. – Paparazzi