C# - Как реагировать на событие, возбужденное в другом классе?

Я получил 2 класса:

Одна служба, которая создает FileSystemWatcher, который запускает событие, когда просматриваемый файл сохраняется в Word. И один UserControl, который имеет некоторые функции, которые мне нужно выполнить при запуске SaveEvent.

Как я могу реагировать на SaveEvent в UserControl?

2 ответа

Решение

Я бы создал событие в Сервисе, которое будет вызываться при вызове FileSystemWatcher. Служба должна обернуть FileSystemWatcher. Родитель обоих объектов вызовет метод в UserControl.

Например: (PSEUDO)


class MyProgram
{
    Service svc;
    UserControl ctrl;

    public MyProgram()
    {
        // create the control
        ctrl = new UserControl();

        // create the service
        svc = new Service();
        svc.SaveEvent += FileChanges;

        /////// you might construct something like:   _(do not use both)_
        svc.SaveEvent += (s, e) => ctrl.FileIsSaved(e.Filename);
    }

    private void FileChanges(object sender, ServiceFileChangedEventArgs e)
    {
        ctrl.FileIsSaved(e.Filename);
    }
}

class Service
{
    // FileSystemWatcher
    private FileSystemWatcher _watcher;

    public Service() // constructor
    {
        // construct it.
        _watcher = new FileSystemWatcher();
        _watcher.Changed += Watcher_Changed;
    }

    // when the file system watcher raises an event, you could pass it thru or construct a new one, whatever you need to pass to the parent object
    private void Watcher_Changed(object source, FileSystemEventArgs e)
    {
        SaveEvent?.Invoke(this, new ServiceFileChangedEventArgs(e.FullPath)); // whatever
    }

    public event EventHandler<SaveEventEventArgs> SaveEvent;
}

class SaveEventEventArgs : EventArgs
{
    // filename etc....
}

Это просто пример псевдо-примера. Но главное, ваш Program/Usercontrol НЕ должно зависеть от FileSystemWatcher, Ваш Service должен обернуть это. Поэтому, когда вы решите изменить FileSystemWatcher к (например) DropBoxWatcherОстальная часть программы не сломана.

Создайте делегат для этого события, чтобы обработать его.

myClass.SaveEvent += DelegateMethod();

public void DelegateMethod(object sender, SaveEventArgs e)
{
    //do stuff
    //run your handler code
}
Другие вопросы по тегам