Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

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

Ответ
 
Опции темы
Старый 22.04.2016, 14:56   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
Репутация: 1
По умолчанию Биндинг к свойству типа 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Погрешность типа double OmegaBerkut C# (си шарп) 3 11.11.2015 21: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


21:06.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru