// I know that this void is breaking the MVVM pattern (a little bit), but I don't think that putting this code in the view model would be a good and reasonable idea because that would require a lot of extra code because all these properties must be accessed somehow. IMO this is the best solution, else I would have written a custom control with this logic private void OkButton_OnClick(object sender, RoutedEventArgs e) { var crowdControlCreateTaskViewModel = (CrowdControlCreateTaskViewModel)DataContext; if (crowdControlCreateTaskViewModel.SelectedCommand == null) { return; } CommandTarget commandTarget; if (GroupsRadioButton.IsChecked == true) { commandTarget = CommandTarget.FromGroups(GroupsListBox.SelectedItems.Cast <string>()); } else if (ClientsRadioButton.IsChecked == true) { commandTarget = CommandTarget.FromClients( ClientsListView.SelectedItems.Cast <ClientViewModel>().Select(x => x.Id).ToList()); } else { commandTarget = null; } TransmissionEvent transmissionEvent; if (ImmediatelyEventRadioButton.IsChecked == true) { transmissionEvent = new ImmediatelyTransmissionEvent(); } else if (DateTimeEventRadioButton.IsChecked == true) { if (!DateAndTimePicker.Value.HasValue || DateTime.Now > DateAndTimePicker.Value) { MessageBoxEx.Show(this, (string)Application.Current.Resources["TimeIsInPast"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } transmissionEvent = new DateTimeTransmissionEvent { DateTime = DateAndTimePicker.Value.Value.ToUniversalTime() }; } else if (OnJoinEventRadioButton.IsChecked == true) { transmissionEvent = new OnJoinTransmissionEvent(); } else if (EveryClientOnceRadioButton.IsChecked == true) { transmissionEvent = new EveryClientOnceTransmissionEvent(); } else if (RepeatingEventRadioButton.IsChecked == true) { if (!RepeatingDateTimePicker.Value.HasValue || !RepeatingTimeSpanUpDown.Value.HasValue) { return; } if (RepeatingTimeSpanUpDown.Value.Value <= TimeSpan.Zero) { MessageBoxEx.Show(this, (string)Application.Current.Resources["ErrorTimeSpanCantBeSmallerThanZero"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } transmissionEvent = new RepeatingTransmissionEvent { DayZero = RepeatingDateTimePicker.Value.Value.ToUniversalTime(), TimeSpan = RepeatingTimeSpanUpDown.Value.Value }; } else { return; } IExecutionEventBuilder executionEventBuilder; if (ImmediatelyExecutionRadioButton.IsChecked == true) { executionEventBuilder = null; } else if (DateTimeExecutionRadioButton.IsChecked == true) { if (!DateAndTimeExecutionPicker.Value.HasValue || DateTime.Now > DateAndTimeExecutionPicker.Value.Value) { MessageBoxEx.Show(this, (string)Application.Current.Resources["TimeIsInPast"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } var dateTimeExecutionEventBuilder = new DateTimeExecutionEventBuilder { DateTime = DateAndTimeExecutionPicker.Value.Value.ToUniversalTime(), DontExecuteWithDelay = DateAndTimeExecutionCheckBox.IsChecked == true }; executionEventBuilder = dateTimeExecutionEventBuilder; } else if (IdleExecutionRadioButton.IsChecked == true) { if (IdleDateAndTimeExecutionCheckBox.IsChecked == true && (!IdleDateAndTimeExecutionPicker.Value.HasValue || DateTime.Now > IdleDateAndTimeExecutionPicker.Value.Value)) { MessageBoxEx.Show(this, (string)Application.Current.Resources["TimeIsInPast"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } if (!IdleTimeNumericUpDown.Value.HasValue) { return; } var idleExecutionEventBuilder = new IdleExecutionEventBuilder { RequiredIdleTime = (int)IdleTimeNumericUpDown.Value, ExecuteAtDateTimeIfItWasntExecuted = IdleDateAndTimeExecutionCheckBox.IsChecked == true, ExecutionDateTime = IdleDateAndTimeExecutionCheckBox.IsChecked == true ? IdleDateAndTimeExecutionPicker.Value.Value.ToUniversalTime() : DateTime.MinValue }; executionEventBuilder = idleExecutionEventBuilder; } else { return; } IStopEventBuilder stopEventBuilder = null; if (crowdControlCreateTaskViewModel.IsSelectedCommandTypeActive) { if (SystemShutdownStopEventRadioButton.IsChecked == true) { stopEventBuilder = new ShutdownStopEventBuilder(); } else if (NeverStopEventRadioButton.IsChecked == true) { stopEventBuilder = null; } else if (DurationEventRadioButton.IsChecked == true) { var duration = DurationStopTimeSpanUpDown.Value; if (duration == null || duration < TimeSpan.FromSeconds(1)) { MessageBoxEx.Show(this, (string)Application.Current.Resources["DurationMustBeGreaterThan1Second"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } stopEventBuilder = new DurationStopEventBuilder { Duration = duration.Value }; } else if (DateTimeStopEventRadioButton.IsChecked == true) { if (!StopEventDateAndTimePicker.Value.HasValue || DateTime.Now > StopEventDateAndTimePicker.Value.Value) { MessageBoxEx.Show(this, (string)Application.Current.Resources["TimeIsInPast"], (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; } stopEventBuilder = new DateTimeStopEventBuilder { DateTime = StopEventDateAndTimePicker.Value.Value.ToUniversalTime() }; } } var validationResult = crowdControlCreateTaskViewModel.SelectedCommand.ValidateInput(); switch (validationResult.ValidationState) { case ValidationState.Error: MessageBoxEx.Show(this, validationResult.Message, (string)Application.Current.Resources["Error"], MessageBoxButton.OK, MessageBoxImage.Error); return; case ValidationState.WarningYesNo: if (MessageBoxEx.Show(this, validationResult.Message, (string)Application.Current.Resources["Warning"], MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes) { return; } break; case ValidationState.Success: break; default: return; } var executionEvent = new ExecutionEvent { Id = executionEventBuilder?.Id ?? 0, Parameter = executionEventBuilder?.GetParameter() }; var stopEvent = new StopEvent { Id = stopEventBuilder?.Id ?? 0, Parameter = stopEventBuilder?.GetParameter() }; crowdControlCreateTaskViewModel.OkButtonClick(commandTarget, transmissionEvent, executionEvent, stopEvent); }