public override async void Save() { if (!FormAdapter.IsDirty && !HasDirtyChildren && LaunchArgs.LaunchType == LaunchTypes.Edit) { await ViewModelNavigation.GoBackAsync(); } else if (FormAdapter.Validate()) { ViewToModel(FormAdapter, Model); if (Model is IValidateable) { var result = Validator.Validate(Model as IValidateable); if (!result.Successful) { await ShowValidationErrorsAsync(result); return; } } var saveResult = await SaveRecordAsync(); if (saveResult.Successful) { //See notes on this method we allow the view model to override what happens when the record is saved. HasDirtyChildren = false; NotifyParentChildDirty(); await PostSaveAsync(); } } }
public bool ViewToModel(EditFormAdapter form, TModel model) { var modelProperties = typeof(TModel).GetTypeInfo().DeclaredProperties; if (!form.Validate()) { return(false); } foreach (var formItem in FormAdapter.FormItems) { var prop = modelProperties.Where(prp => prp.Name.ToLower() == formItem.Name.ToLower()).FirstOrDefault(); switch (formItem.FieldType) { case FormField.FeildType_EntityHeaderPicker: break; case FormField.FieldType_CheckBox: if (bool.TryParse(formItem.Value, out bool result)) { prop.SetValue(model, result); } break; case FormField.FieldType_Picker: if (String.IsNullOrEmpty(formItem.Value)) { prop.SetValue(model, null); } else { if (prop.PropertyType == typeof(String)) { prop.SetValue(model, formItem.Options.Where(opt => opt.Key == formItem.Value).First().Key); } else { var eh = Activator.CreateInstance(prop.PropertyType) as EntityHeader; eh.Id = formItem.Value; eh.Text = formItem.Options.Where(opt => opt.Key == formItem.Value).First().Label; prop.SetValue(model, eh); } } break; case FormField.FieldType_Integer: if (!String.IsNullOrEmpty(formItem.Value)) { if (int.TryParse(formItem.Value, out int intValue)) { prop.SetValue(model, intValue); } } break; case FormField.FieldType_Decimal: if (!String.IsNullOrEmpty(formItem.Value)) { if (double.TryParse(formItem.Value, out double intValue)) { prop.SetValue(model, intValue); } } break; case FormField.FieldType_NameSpace: case FormField.FieldType_MultilineText: case FormField.FieldType_Text: case FormField.FieldType_Key: prop.SetValue(model, formItem.Value); break; case FormField.FieldType_Password: if (!String.IsNullOrEmpty(formItem.Value)) { prop.SetValue(model, formItem.Value); } break; } } return(true); }