2013-08-26 5 views
5

は、私は、イベントハンドラを登録しています:は、イベントハンドラNullが<code>MainWindow</code>コンストラクタで

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"); 
     } 
    } 
} 

しかしPageViewDocTextで、NewPageIRPROがnullである私が間違っているのは何


PageViewDocTextから、MainWindow.ViewIPROに電話します。

このイベントハンドラが起動し、あなたが別のクラス(リストされていない)からのイベントを呼び出していると不足しているデリゲートがあるようpageViewDocText.NewPageIRPRO下の行+ =

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

'PageViewDocText'コンストラクタはそのイベントを発生していますか?これは簡単にデバッグできます。コールスタックを見てください。問題のコードを削除しない限り、サブスクリプション後にイベントがnullになることはありません。 –

+1

私は 'NewPageIRPRO'がnullであるコードを表示する必要があると思います。 –

+0

@EdS。いいえ、ボタンイベントハンドラはそのイベントを発生させません。私はなぜイベントハンドラも空であることについて迷っています。 GabeLib(純粋なクラス)では、私は同じように思われるイベントハンドラを使用し、うまく動作します。 – Paparazzi

答えて

1

が見え登録されています。

は、このコードを試してみてください。

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

私は従いません。 btn_PageBreakNextはページ上のボタンのイベントハンドラであり、ページやクラスから呼び出されることはありません。 – Paparazzi

+0

私はあなたのコードに似た別のクラスで作成されたイベントデリゲートを使ってサンプルプロジェクトを作成しました。だから、私はあなたのコードが正しいと思います。 NewPageIRPROはnullなので、MainWindowで作成された同じインスタンスではなく、PageViewDocTextの別のインスタンスである可能性があることを示しています。 PageViewDocTextのコンストラクタにDocEventHandlerデリゲートを配置することをお勧めします。例えばPageViewDocText(SearchCls.DocEventHandler NewPageIRPRO){this.NewPageIRPRO = NewPageIRPRO; }。これにより、ハンドラなしでインスタンスが作成されないようにする必要があります。 – sharpguru

+0

まだ作業中です。そして私はあなたの意見に同意します。そこに2つのPageViewDocTextオブジェクトがあるように見えます。 DocEventHandlerをctorに配置するとそれが修正されますが、なぜ2つあるのか把握したいのです。 – Paparazzi

関連する問題