/// <summary>
 /// Установка привязки цвета текста элемента к свойству объекта <see cref="SummaryProperty"/>
 /// </summary>
 /// <param name="element">Визуальный элемент</param>
 /// <param name="summaryProperty">Суммарное свойство</param>
 private void SetForegroundBinding(DependencyObject element, SummaryProperty summaryProperty)
 {
     BindingOperations.SetBinding(element, ForegroundProperty,
                                  new Binding
     {
         Source = summaryProperty,
         UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
         Path = new PropertyPath("Foreground")
     });
 }
        /// <summary>
        /// Создание двусторонней привязки для использования в элементе <see cref="NumericBox"/>
        /// По какой-то причине при привязке к типу object не работает. В связи с этим делаю такой вот
        /// лайфхак - добавляю в класс <see cref="SmartEntityProperty"/> два свойства конкретного типа.
        /// Это нужно, чтобы решить эту специфическую проблему в данном проекте и не менять из-за этого
        /// библиотеку оформления
        /// </summary>
        /// <param name="summaryProperty">Суммарное свойство</param>
        /// <param name="isInteger">True - целое число. False - дробное число</param>
        private Binding CreateTwoWayBindingForPropertyForNumericValue(
            SummaryProperty summaryProperty, bool isInteger)
        {
            var binding = new Binding
            {
                Mode = BindingMode.TwoWay,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                Source = summaryProperty,
                Path   = isInteger ? new PropertyPath("IntValue") : new PropertyPath("DoubleValue")
            };

            return(binding);
        }
        /// <summary>
        /// Получение локализованного описания свойства
        /// </summary>
        /// <param name="summaryProperty">Суммарное свойство</param>
        private static string GetPropertyDescription(SummaryProperty summaryProperty)
        {
            try
            {
                var description = ModPlusAPI.Language.GetItem(summaryProperty.DescriptionLocalizationKey);
                if (!string.IsNullOrEmpty(description))
                {
                    return(description);
                }
            }
            catch
            {
                // ignore
            }

            return(string.Empty);
        }
        /// <summary>
        /// Создание двусторонней привязки к суммарному свойству
        /// </summary>
        /// <param name="summaryProperty">Суммарное свойство</param>
        /// <param name="converter">Конвертер (при необходимости)</param>
        /// <returns>Объект типа <see cref="Binding"/></returns>
        private static Binding CreateTwoWayBindingForProperty(
            SummaryProperty summaryProperty, IValueConverter converter = null)
        {
            var binding = new Binding
            {
                Mode = BindingMode.TwoWay,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                Source = summaryProperty,
                Path   = new PropertyPath("SummaryValue")
            };

            if (converter != null)
            {
                binding.Converter = converter;
            }

            return(binding);
        }
        /// <summary>
        /// Получение локализованного (отображаемого) имени свойства
        /// </summary>
        /// <param name="summaryProperty">Суммарное свойство</param>
        private static string GetPropertyDisplayName(SummaryProperty summaryProperty)
        {
            try
            {
                var displayName = ModPlusAPI.Language.GetItem(summaryProperty.DisplayNameLocalizationKey);
                if (!string.IsNullOrEmpty(displayName))
                {
                    if (!displayName.EndsWith(":"))
                    {
                        displayName = $"{displayName}:";
                    }

                    return(displayName);
                }
            }
            catch
            {
                // ignore
            }

            return(string.Empty);
        }