Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2016, 13:56   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию Биндинг к свойству типа double + валидация

Я использую для валидации вот такой класс:

Код:
public abstract class ViewModelBase : INotifyPropertyChanged, IDataErrorInfo
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        private readonly HashSet<string> PropertiesWithErrors = new HashSet<string>();
 
        protected bool HasValidationErrors { get { return PropertiesWithErrors.Any(); } }
 
        public string this[string propertyName] { get { return Validate(propertyName); } }
 
        public string Error { get { throw new NotImplementedException(); } }
 
        protected virtual string Validate(string propertyName)
        {
            var value = GetType().GetProperty(propertyName).GetValue(this);
            var results = new List<ValidationResult>();
            var context = new ValidationContext(this, null, null) { MemberName = propertyName };
 
            if (!Validator.TryValidateProperty(value, context, results))
            {
                PropertiesWithErrors.Add(propertyName);
                return results.First().ErrorMessage;
            }
 
            PropertiesWithErrors.Remove(propertyName);
            return string.Empty;
        }
 
        protected virtual void RaisePropertyChanged(string pname) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pname));
 
        protected virtual void Set<T>(string pname, ref T field, T value)
        {
            field = value;
            RaisePropertyChanged(pname);
        }
    }
Нужно только отнаследовать от него ViewModel и создать свойство для биндинга. Это очень удобно, т.к. сразу ясно есть ли ошибки валидации. Но у меня такая проблема. Если у меня свойство типа double то у меня полностью перестают вводиться точки и запятые. Как же мне поставить дробную точку (или запятую)?

Ну например:
Код:
public class ViewModel : ViewModelBase
{
    public double Value { get; set; }
}
Код:
<TextBox Text="{Binding Path=Value, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
Кроме того при работе с этой ViewModel-ю перестают работать всякие полезные атрибуты из System.ComponentModel.DataAnnotatio ns аля Range и т.п. Почему так происходит?
NewLamer&Programer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Погрешность типа double OmegaBerkut C# (си шарп) 3 11.11.2015 20:12
C++, не выводит значение типа double Sultanova Помощь студентам 3 27.01.2013 17:06
TMaskEdit типа Double kashirin.p Общие вопросы Delphi 0 17.04.2012 17:23
Проблема с выводом типа double ArmanPrestige Общие вопросы C/C++ 3 20.02.2012 03:58
in Формула типа String out результат типа Double Gypsy Общие вопросы Delphi 3 16.04.2010 10:21