Почему я получаю «Ссылку на объект, не установленную на экземпляр объекта» в моем настраиваемом событии OnLoaded? - PullRequest
1 голос
/ 09 февраля 2010

Что мне нужно сделать, чтобы этот код работал?

Я просто хочу, чтобы класс сгенерировал событие по завершении загрузки, а класс-потребитель реагировал на него.

В OnLoaded выдается сообщение о том, что оно пустое.

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

1 Ответ

4 голосов
/ 09 февраля 2010

Этот код вызывает OnLoaded, прежде чем присоединить обработчик события:

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

, который выполняет следующее:

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

Чтобы это исправить, требуется делегат слушателя в качестве параметра конструктора FileManager и присоедините его перед вызовом OnLoaded:

public FileManager(LoadedHandler handler) {
        this.OnLoaded += handler;
        Name = "this is the test file manager";
        OnLoaded(this, new FileManagerArgs("no errors"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...