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
}