Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DependencyProperty и ValidationRules 
:(
    Опции темы
DragonFire
Дата 21.9.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: нет
Всего: 9



Все добрый день. С DataBinding работаю немного, поэтому возникает много непоняток. Например, задача - есть класс с логикой:
Код

public class SimpleClass : DependencyObject
    {
        ...

        public Double VolumeRepository
        {
            get { return (Double)GetValue(VolumeRepositoryProperty); }
            set { SetValue(VolumeRepositoryProperty, value); }
        }

        public static readonly DependencyProperty VolumeRepositoryProperty =
            DependencyProperty.Register("VolumeRepository", typeof(Double), typeof(SimpleClass), new PropertyMetadata(0.0, OnVolumeRepositoryChanged));

        private static void OnVolumeRepositoryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            (d as SimpleClass).InvalidateProperty(VolumeLiquidProperty);
        }

        public Double VolumeLiquid
        {
            get { return (Double)GetValue(VolumeLiquidProperty); }
            set { SetValue(VolumeLiquidProperty, value); }
        }
        public static readonly DependencyProperty VolumeLiquidProperty =
            DependencyProperty.Register("VolumeLiquid", typeof(Double), typeof(SimpleClass), new PropertyMetadata(0.0));
    }

Мне необходимо отобразить эти данных в TextBox для ввода и изменения. Причем на каждую величину должны накладываться ограничения:
1) VolumeLiquid и  VolumeRepository лежат в пределах от 0 до 100
2) VolumeLiquid<=VolumeRepository
С первым все понятно - добавляем пользовательское условие:
Код

public class DoubleRule : ValidationRule
    {
        public Double Min  { ... }
        public Double Max { ... }

        public override ValidationResult Validate(object value, CultureInfo culture)
        {
            Double val = 0;
            if (!Double.TryParse(value.ToString(), NumberStyles.Any, culture, out val))
                return new ValidationResult(false, "Недопустимые символы в строке.");
            if ((val < Min) || (val > Max))
                return new ValidationResult(false, "Значение лежит вне диапазона");
            return new ValidationResult(true, null);
        }
    }

И в TextBox создаем привязку типа такой:
Код

           <TextBox.Text>
                <Binding Path="VolumeLiquid" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                    <Binding.ValidationRules>                        
                        <local:DoubleRule Min="0" Max="100" />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>

Аналогичную привязку делаем для VolumeRepository и первая часть задачи готова.
Теперь пытаюсь решить вторую задачу. Хочу, чтобы между значениями возникла однозначная зависимость. Самое простое решение - использовать CoerceValueCallback. Но при таком подходе пользователь не сможет ввести "неверное" значение, чтобы потом исправить на верное. А мне необходимо чтобы значения можно было сначала ввести все, потом откорректировать.
Второй подход - IDataErrorInfo:
Код

public string this[string propertyName]
        {
            get
            {
                if (propertyName == "VolumeLiquid")
                {
                    if (VolumeLiquid > VolumeRepository)
                        return "Недопустимое значение!";
                }
                return null;
            }
        }

Отлично, при вводе неправильной VolumeLiquid мы получаем подсветку. Уже лучше. Но все бы ничего, только вот пример:
В VolumeRepository вводим 60 (все хорошо)
В VolumeLiquid вводим 70 (подсвечивается красным)
В VolumeRepository вводим 80 
И вот тут я застрял - как заставить VolumeLiquid пересчитать значение и показать пользователю что все хорошо? Или обратный пример - когда сначало значение рабочее вводиться, а потом VolumeRepository уменьшается и необходимо подсветить красным VolumeLiquid...

Заранее всем спасибо, кто сможет решить такую проблему... smile 


--------------------
PM MAIL ICQ   Вверх
math64
Дата 22.9.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Вероятно, это есть здесь: http://www.codeplex.com/wpg (из темы http://forum.vingrad.ru/forum/topic-270932.html)

PM   Вверх
DragonFire
Дата 22.9.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: нет
Всего: 9



Не уверен что есть... 


--------------------
PM MAIL ICQ   Вверх
math64
Дата 22.9.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Да, действительно нет - вставил в их окно Slider и указаал его в качестве Instance для PropertyGrid. При вводе неправильного значения в Value и перехода на другое поле его значение исправляется.
PM   Вверх
DragonFire
Дата 24.9.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: нет
Всего: 9



Решение изложил в виде статьи:
http://dragonfire.cimanu.ru/post/Binding-%...%D0%B2-WPF.aspx


--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.