thank you very much for your help. The DialogClosing event is indeed the place where to do validiation etc.
Maybe a little hint for others who are reading this. Since I make heavy use of the AppointmentDialogViewModel when working with the Appointment-Dialog I want to have access to it inside the DialogClosing event. The CancelRoutedEventArgs does not expose the SchedulerDialogViewModel directly. But if you cast it to DialogEventArgs everything is fine. Here is my code:
// e is of type CancelRoutedEventArgs, second argument of DialogClosing event
var vm = ((DialogEventArgs)e).DialogViewModel
var myAppointment = vm.Occurrence.Appointment;
From there on you can do everything you want with the ViewModel and its properties.