0

In my window, I need to set a list of FileWatcher, for a list on machines. For this I set a new class MachineWatcher :

public class MachineWatcher : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
        private bool NotifyPropertyChanged<T>(ref T variable, T valeur, [CallerMemberName] string nomPropriete = null)
        {
            if (object.Equals(variable, valeur)) return false;

            variable = valeur;
            NotifyPropertyChanged(nomPropriete);
            return true;
        }
        private Machine machine { get; set; }
        public Machine Machine { get { return this.machine; } set { this.machine = value; } }
        private string typeWatcher { get; set; } = "";
        public string TypeWatcher { get { return this.typeWatcher; } set { this.typeWatcher = value; } }
        FileSystemWatcher watcher { get; set; }
        public FileSystemWatcher Watcher { get { return this.watcher; } set { this.watcher = value; } }
        private string lastFileName { get; set; } = "";
        private DateTime lastEvent { get; set; } = DateTime.MinValue;
        private ObservableCollection<string> listErrors { get; set; } = new ObservableCollection<string>();
        public ObservableCollection<string> ListErrors { get { return this.listErrors; } set { this.listErrors = value; NotifyPropertyChanged("ListErrors"); } }
        public MachineWatcher()
        {

        }
        public MachineWatcher(string type,string directoryStock,string fileFilter)
        {
            this.typeWatcher = type;
            this.watcher = new FileSystemWatcher
            {
                Path = Path.GetDirectoryName(directoryStock),
                Filter = fileFilter
            };
            if (this.typeWatcher=="stock")
            {
                this.watcher.Created += new FileSystemEventHandler(OnStockFileCreated);
            }
            else if(this.typeWatcher=="machine")
            {
                //this.watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.CreationTime;
                this.watcher.Changed += OnFeedBackNesterCreated;
                this.watcher.Created += OnFeedBackNesterCreated;
                this.watcher.Renamed += OnFeedBackNesterCreated;
                this.watcher.Deleted += OnFeedBackNesterCreated;
            }
            this.watcher.EnableRaisingEvents = true;
        }
        private void OnFeedBackNesterCreated(object source, FileSystemEventArgs e)
        {
            try
            {
                //try to read file
            }
            catch
            {
                string errorText = "Error reading file " + e.FullPath;
                this.ListErrors.Add(errorText);
            }
        }
        
    }

Then in my mainWindow I defined a List<MachineWatcher>

I create then like that :

MachineWatcher machineWatcher = new MachineWatcher("stock", directoryStock, "*.csv");
this.listMachineWatchers.Add(machineWatcher);

What I would like, is when my MachineWatcher meets an error, and go in catch, update a Observable<string> ListErrors, where are written all the errors for all machines.

Is there a way to call a function in MainWindows from the object MachineWatcher?

Siegfried.V
  • 1,508
  • 1
  • 16
  • 34

1 Answers1

1

Is there a way to call a function in MainWindows from the object MachineWatcher?

Yes, assuming you have a reference to the MainWindow in MachineWatcher.

You could for example inject the MachineWatcher class with a reference to MainWindow when you instantiate it:

private readonly MainWindow mainWindow;

public MachineWatcher(string type,string directoryStock,string fileFilter, MainWindow mainWindow)
{
    this.typeWatcher = type;
    this.watcher ...
    this.mainWindow =  mainWindow;
}

MainWindow:

MachineWatcher machineWatcher = new MachineWatcher("stock", directoryStock, "*.csv", this);

Then you can call any member of mainWindow directly from the MachineWatcher class.

mm8
  • 163,881
  • 10
  • 57
  • 88
  • thanks, didn't even think about that. I also today found that link https://stackoverflow.com/questions/8490533/notify-observablecollection-when-item-changes. It also worked for me, just implemented it. Your method seems easier to implement. Which of them would you advise? – Siegfried.V Nov 11 '22 at 17:50