async Task <double> calculateNewAverage() { double notaAverage = 0.0f; calificacionCategorias = await FirebaseDB.getCategoriasForCalificacion(asignaturaUid, evaluacionUid, calificacionUid); foreach (CalificacionCategoria calificacionCategoria in calificacionCategorias) { List <CalificacionElemento> calificacionElementos = await FirebaseDB.getElementsForCalificacion(asignaturaUid, evaluacionUid, calificacionUid, calificacionCategoria.Uid); double categoriaAverage = 0.0f; foreach (CalificacionElemento calificacionElemento in calificacionElementos) { int elementoPeso = calificacionElemento.Peso; double elementoNota = calificacionElemento.Nota; categoriaAverage += elementoPeso * elementoNota / 100.0f; } int categoriaPeso = calificacionCategoria.Peso; notaAverage += categoriaPeso * categoriaAverage / 100.0f; } return(notaAverage); }
protected async override void OnAppearing() { base.OnAppearing(); calificacionCategorias = await FirebaseDB.getCategoriasForCalificacion(asignaturaUid, evaluacionUid, calificacionUid); var layout = new StackLayout { Margin = new Thickness(20, 20, 20, 20) }; foreach (CalificacionCategoria categoria in calificacionCategorias) { var categoriaLabel = new Label { Text = categoria.CategoriaName }; layout.Children.Add(categoriaLabel); List <CalificacionElemento> calificacionElementos = await FirebaseDB.getElementsForCalificacion(asignaturaUid, evaluacionUid, calificacionUid, categoria.Uid); foreach (CalificacionElemento elemento in calificacionElementos) { // save calificacion elemento to update slider range later elemento.CalificacionCategoriaUid = categoria.Uid; calificacionElementoDict.Add(elemento.Uid, elemento); var elementLayout = new StackLayout { Orientation = StackOrientation.Horizontal, Margin = new Thickness(20, 0, 0, 0) }; var elementoLabel = new Label { Text = elemento.ElementoName }; // elementoSlider and sliderValuelabel have to be declard before Picker since they are accessed during initial Picker-index setting var elementoSlider = new Slider { Minimum = 0, Maximum = 1, Value = 0.5, WidthRequest = 100, VerticalOptions = LayoutOptions.FillAndExpand, StyleId = elemento.Uid // bind elementoUid to slider for identification in ValueChanged callback }; elementoSlider.ValueChanged += OnSliderValueChanged; sliderDict.Add(elemento.Uid, elementoSlider); sliderValuelabel = new Label { Text = elemento.Nota.ToString() }; labelDict.Add(elemento.Uid, sliderValuelabel); var elementoPicker = new Picker { HorizontalOptions = LayoutOptions.FillAndExpand, StyleClass = new ObservableCollection <string>() { categoria.Uid, elemento.Uid, "true" }, // misuse StyleClass to set values to each picker ItemsSource = new List <string>() { elemento.Nivel1Name, elemento.Nivel2Name, elemento.Nivel3Name, elemento.Nivel4Name }, }; elementoPicker.SelectedIndexChanged += OnPickerSelectedIndexChanged; elementoPicker.SelectedIndex = elemento.Nivel; elementLayout.Children.Add(elementoLabel); elementLayout.Children.Add(elementoPicker); elementLayout.Children.Add(elementoSlider); elementLayout.Children.Add(sliderValuelabel); layout.Children.Add(elementLayout); } } var btn = new Button { Text = "Guardar" }; btn.Clicked += async(sender, ea) => { foreach (KeyValuePair <string, CalificacionElemento> entry in calificacionElementoDict) { CalificacionElemento calificacionElemento = entry.Value; await FirebaseDB.updateCalificacionElemento(asignaturaUid, evaluacionUid, calificacionUid, calificacionElemento.CalificacionCategoriaUid, calificacionElemento.Uid, calificacionElemento); } CalificacionEvaluacion calificacion = await FirebaseDB.getCalificacionById(asignaturaUid, evaluacionUid, calificacionUid); calificacion.Nota = await calculateNewAverage(); await FirebaseDB.updateCalificacion(asignaturaUid, evaluacionUid, calificacionUid, calificacion); await Navigation.PopAsync(); }; layout.Children.Add(btn); Content = layout; }