async Task TryInvokeButton(VM.Button vm) { if (vm.ActionAttributes?.Any(x => x.DisableValidation) != true) { bool hasErr = false; foreach (var x in vm.Parent.Elements.OfType <VM.StateElement>()) { if (!x.Validate()) { hasErr = true; } } if (hasErr) { return; } } var confirmAttr = vm?.ActionAttributes.OfType <ConfirmAttribute>().SingleOrDefault(); if (confirmAttr != null) { var proceed = await dialogs .ShowConfirm( confirmAttr.Title, confirmAttr.Message, confirmAttr.AffirmativeText ?? "OK", confirmAttr.DismissiveText ?? "Cancel"); if (proceed) { await InvokeButtonAction(vm); } } else { await InvokeButtonAction(vm); } }
async Task InvokeButtonAction(VM.Button vm) { var msgAttr = vm?.ActionAttributes.OfType <MessageAttribute>().SingleOrDefault(); var progAttr = vm?.ActionAttributes.OfType <ProgressAttribute>().SingleOrDefault(); var pars = vm.Method.GetParameters(); var hasProgPar = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaProgress)) != null; var hasMsgPar = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaMessage)) != null; var hasActionPar = pars.SingleOrDefault(x => x.ParameterType == typeof(IMechaAction)) != null; var hasProg = hasProgPar || progAttr != null; var hasMsg = hasMsgPar || msgAttr != null; IMechaMessage msgDial = hasMsgPar ? new MessageDialog() : null; async Task InvokeAction(IMechaProgress progDial) { var argl = new List <Tuple <Type, object> >(); if (hasProgPar) { argl.Add(Tuple.Create(typeof(IMechaProgress), (object)progDial)); } if (hasMsgPar) { argl.Add(Tuple.Create(typeof(IMechaMessage), (object)msgDial)); } if (hasActionPar) { argl.Add(Tuple.Create(typeof(IMechaAction), (object)new ButtonHandle(vm))); } var args = argl.Count > 0 ? pars.Join(argl, x => x.ParameterType, x => x.Item1, (x, y) => y.Item2).ToArray() : null; if (argl.Count > 0 && argl.Count != args.Length) { throw new Exception($"The '{vm.Method.Name}' method has unsupported parameters."); } if (vm.Method.ReturnType == typeof(Task)) { await(Task) vm.Invoke(args); } else { vm.Invoke(args); } } bool actionError = false; if (hasProg) { var message = progAttr?.Message ?? "Please wait..."; var title = progAttr?.Title ?? "processing"; var progDial = await dialogs.ShowProgress(title, message, false); try { await InvokeAction(progDial); } catch (Exception exception) { actionError = true; if (progDial.IsOpen) { await progDial.CloseAsync(); } await dialogs.ShowError("Error", exception.GetBaseException().Message); } if (progDial.IsOpen) { await progDial.CloseAsync(); } } else { try { await InvokeAction(null); } catch (Exception exception) { actionError = true; await dialogs.ShowError("Error", exception.GetBaseException().Message); } } if (hasMsg) { var message = msgAttr?.Message ?? "Finished."; var title = msgAttr?.Title ?? "done"; if (!actionError) { await dialogs.ShowInfo(msgDial?.Title ?? title, msgDial?.Message ?? message); } } }