private async void CloneJob(object sender, RoutedEventArgs e) { var jobVM = (JobViewModel)(sender as Button).Tag; var entity = await jobRepo.Get(jobVM.Id); var jsonSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; var oldOptions = JsonConvert.DeserializeObject <JobOptionsWrapper>(entity.JobOptions, jsonSettings).Options; var newOptions = JobOptionsFactory.CloneExistant(oldOptions); Action <JobOptions> onAccept = async options => { var cloned = await vm.CloneJob(entity.JobType, options); mainWindow.DisplayJob(cloned); }; Page page = jobVM switch { MultiRunJobViewModel => new MultiRunJobOptionsDialog(newOptions as MultiRunJobOptions, onAccept), ProxyCheckJobViewModel => new ProxyCheckJobOptionsDialog(newOptions as ProxyCheckJobOptions, onAccept), _ => throw new NotImplementedException() }; new MainDialog(page, $"Clone job #{entity.Id}", 800, 600).ShowDialog(); }