/// <summary> /// Creates editing items on the transferred panel. /// <para></para> /// Создает элементы редактирования на передаваемой панели. /// </summary> public void CreateControlsForObject(StackPanel panel) { panel.Children.Clear(); Type objType = ObjectWithValues.GetType(); controlsDictionary = new Dictionary <string, ControlAndInfo>(); foreach (FieldInfo fieldInfo in objType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)) { if (typeof(IFormattable).IsAssignableFrom(fieldInfo.FieldType) || typeof(bool).IsAssignableFrom(fieldInfo.FieldType)) { Type fieldType = fieldInfo.FieldType; object fieldValue = fieldInfo.GetValue(ObjectWithValues); GroupBox groupBox = new GroupBox(); groupBox.Padding = new Thickness(5, groupBox.FontSize * 0.7 + 5, 5, 5); groupBox.Header = fieldInfo.Name; ControlAndInfo controlAndInfo = new ControlAndInfo(); Control control; NumericValuesAttribute atr = fieldInfo.GetCustomAttribute <NumericValuesAttribute>(); if (typeof(bool).IsAssignableFrom(fieldInfo.FieldType)) { CheckBox cb = new CheckBox(); cb.IsChecked = Convert.ToBoolean(fieldValue); control = cb; } else if (atr == null) { control = UseTextBox(fieldValue); } else if (atr.WayToShow == NumericValuesWayToShow.Default) { control = UseTextBox(fieldValue); controlAndInfo.Min = atr.Min; controlAndInfo.Max = atr.Max; } else if (atr.WayToShow == NumericValuesWayToShow.Slider) { SliderWithValueLabel swl = new SliderWithValueLabel(); swl.slider.Minimum = atr.Min; swl.slider.Maximum = atr.Max; swl.slider.Value = Convert.ToDouble(fieldValue); control = swl; } else { throw new Exception("Don`t know how to show field " + fieldInfo.Name + "."); } ////// //content.Margin = new Thickness(5, 0, 5, 0); controlAndInfo.Control = control; controlsDictionary.Add(fieldInfo.Name, controlAndInfo); groupBox.Content = control; panel.Children.Add(groupBox); } } }
/// <summary> /// This function try to convert ControlAndInfo values. If the type of error when converting will be ParsebleException, function throws it. /// All other errors are processed and return an error message via errorMessage. /// <para></para> /// Эта функция пытается конвертировать значения ControlAndInfo. Если тип ошибки при конвертировании будет ParsebleException, то она выкинет ее. /// Все остальные ошибки обработаются и вернут сообщени об ошибке через errorMessage. /// </summary> object TryToConvert(out string errorMessage, ControlAndInfo controlAndInfo, FieldInfo fieldInfo) { //Shit-code, i know. But it`s only way i find to make it work. Type fieldType = fieldInfo.FieldType; object controlValue = null; string errMsg = ""; try { controlValue = GetValueFromControl(controlAndInfo.Control, fieldType); if (controlValue == null) { throw new Exception(); } } catch (Exception ex) { if (typeof(ParsebleException).IsAssignableFrom(ex.GetType())) { throw; } else { errMsg += string.Format(LanguageHandler.GetInstance().IncorrectValueMsg, fieldInfo.Name, fieldType.Name); } } double min = controlAndInfo.Min, max = controlAndInfo.Max; try { if (min < max) { double value = Convert.ToDouble(GetValueFromControl(controlAndInfo.Control)); if (!(value >= min && value <= max)) { throw new Exception(); } } } catch { errMsg += string.Format(LanguageHandler.GetInstance().IncorrectRangeMsg, fieldInfo.Name, min, max); } errorMessage = errMsg; return(controlValue); }