2010-02-09 1 views
1

Que dois-je faire pour que ce code fonctionne? Je veux simplement que la classe lance un événement quand elle a fini de charger et que la classe consommatrice réagisse.Pourquoi ai-je une "Référence d'objet non définie sur une instance d'un objet" dans mon événement OnLoaded personnalisé?

Il obtient une erreur sur OnLoaded indiquant qu'il est nul.

using System; 
using System.Windows; 

namespace TestEventLoaded8282 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      FileManager fm = new FileManager(); 
      fm.OnLoaded += new FileManager.LoadedHandler(fm_OnLoaded); 
     } 

     void fm_OnLoaded(object obj, FileManagerArgs args) 
     { 
      Console.WriteLine("the file manager is loaded: " + args.Message); 
     } 
    } 

    public class FileManager 
    { 
     public string Name { get; set; } 

     public delegate void LoadedHandler(object obj, FileManagerArgs args); 
     public event LoadedHandler OnLoaded; 

     public FileManager() 
     { 
      Name = "this is the test file manager"; 
      OnLoaded(this, new FileManagerArgs("no errors")); 
     } 
    } 

    public class FileManagerArgs : EventArgs 
    { 
     public string Message { get; set; } 

     public FileManagerArgs(string message) 
     { 
      Message = message; 
     } 
    } 
} 

Répondre

4

Ce code appelle OnLoaded avant qu'il attache un gestionnaire d'événements:

public Window1() { 
    InitializeComponent(); 
    FileManager fm = new FileManager(); 
    // The next line attaches a handler, but 
    // not until the constructor finishes 
} 

qui exécute les éléments suivants:

public FileManager() { 
     Name = "this is the test file manager"; 
     OnLoaded(this, new FileManagerArgs("no errors")); // No handler yet! 
} 

Pour résoudre ce problème, exigent le délégué de l'auditeur en tant que paramètre constructeur FileManager et l'attacher avant d'appeler OnLoaded:

public FileManager(LoadedHandler handler) { 
     this.OnLoaded += handler; 
     Name = "this is the test file manager"; 
     OnLoaded(this, new FileManagerArgs("no errors")); 
} 
+0

merci, cela m'a aidé à obtenir mon code pour poser la question que je voulais initialement poster: http://stackoverflow.com/questions/2230064/how-can-i-make-consuming-custom-events-on- my-classes-facultatif, c'est peut-être le même problème, je vais travailler à travers ce code ici. –

+0

Excellent! Quelques autres gars ont d'abord répondu à votre question de suivi. :) –

Questions connexes