public MacroViewModel( ILoggerService loggerService, IMonitorDialog monitorDialog, IFileService fileService, IMacroService macroService) { IsRunning = false; SavedMacros = new ObservableCollection <IMacro>(); _loggerService = loggerService; _monitorDialog = monitorDialog; _fileService = fileService; _macroService = macroService; Recorders = _macroService.CreateRecorders(); Record = new DelegateCommandAsync(() => { _runningRecordSession = _macroService.CreateSession(SelectedRecorder); _runningRecordSession?.Start(); Stop.RaiseCanExecuteChanged(); Record.RaiseCanExecuteChanged(); }, () => SelectedRecorder != null && _runningRecordSession == null); Stop = new DelegateCommandAsync(() => { var macro = _runningRecordSession.Stop(); _runningRecordSession = null; SavedMacros.Add(macro); Stop.RaiseCanExecuteChanged(); Record.RaiseCanExecuteChanged(); Build.RaiseCanExecuteChanged(); }, () => _runningRecordSession != null); Build = new DelegateCommandAsync(async() => { var macro = SavedMacros.First(); SavedMacros.RemoveAt(0); Build.RaiseCanExecuteChanged(); var saveResult = _monitorDialog.SaveFileDialog("Save script", "test_script.cs", "Monitor Script (*.cs)|*.cs;|All files (*.*)|*.*", null); if (saveResult.Success) { using (var stream = _fileService.CreateNewFileStream(saveResult.FileName)) { await macro.Serialize(stream); _loggerService.LogMessage(this, $"Script built & saved '{saveResult.FileName}'!", Severity.Info); } } }, () => SavedMacros.Any()); }