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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая валидация 
:(
    Опции темы
andrey_pro
Дата 11.5.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

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



есть контрол с валидацией:
Код

<TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource TinyVTextBox}" MaxLength="50">
            <TextBox.Text>
                <Binding Path="ObjectForEdit.SellContractNo" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>        
                        <uibase:RequiredRule AllowStringEmpty="True" 
                                             ErrorMessage="Необходимо указать номер договора!"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>


тут значение AllowStringEmpty присвоено True изначально, т.е. в TextBox не принимаются пустые строки.

Мне нужно сделать примерно следующее:
AllowStringEmpty={Binding Path=ObjectForEdit.IsSold, UpdateSourceTrigger=PropertyChanged}"

т.е. что была динамическая привязка от объекта, но этот вариант не прокатывает

код RequiredRule:
Код

public class RequiredRule : BaseValidationRule
    {
        public bool AllowStringEmpty { get; set; }
        
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string strValue = (value ?? string.Empty) as string;
            bool isValid = value != null;
            isValid = isValid && (value.ToString() != string.Empty || AllowStringEmpty);
            return new ValidationResult(isValid, isValid ? null : ErrorMessage);
        }
    }


как это можно реализовать?
PM MAIL   Вверх
SergeyLoginov
Дата 4.6.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



BaseValidationRule не является DependencyObject, соответственно не может содержать DependencyProperty.
И это крайне досадно :(. Сей момент меня печалит, пожалуй, в бОльшей степени, чем невозможность привязки к свойству ConverterParameter в конвертерах.
Хоть какое-то решение можно найти по этой ссылке. Но, к сожалению, скорее всего Вам придется назначать источник привязки в коде.
Смысл в том, чтобы объявить тип параметра правила валидации как, например, MyValidationParameters, где:
Код

public class MyValidationParameters : DependencyObject
{
        /// <summary>
        ///     Признак допустимости пустых строк
        /// </summary>
        public bool AllowStringEmpty 
        {
            get { return (bool)GetValue(AllowStringEmptyProperty); }
            set { SetValue(AllowStringEmptyProperty, value); }
        }

        /// <summary>
        ///    Свойство зависимостей для AllowStringEmpty
        /// </summary>
        public static readonly DependencyProperty AllowStringEmptyProperty =
            DependencyProperty.Register("AllowStringEmpty", typeof(bool), typeof(MyValidationParameters));
}

При этом 

Код

public class RequiredRule : BaseValidationRule
    {
        public MyValidationParameters ValidationParameters { get; set; }
        
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string strValue = (value ?? string.Empty) as string;
            bool isValid = value != null;
            isValid = isValid && (value.ToString() != string.Empty || ValidationParameters.AllowStringEmpty);
            return new ValidationResult(isValid, isValid ? null : ErrorMessage);
        }
    }


И затем уже в разметке привязать значение AllowStringEmpty объекта MyValidationParameters:

Код

<Binding.ValidationRules>        
    <uibase:RequiredRule  ErrorMessage="Необходимо указать номер договора!"> 
        <uibase:RequiredRule.ValidationParameters>
            <uibase:ValidationParameters AllowStringEmpty={Binding ...} />
        </uibase:RequiredRule.ValidationParameters>
    </uibase:RequiredRule>
</Binding.ValidationRules>


Но... Как говорится "You need to explicitly set the DateToCheckFrom's Source because the DateCheck object is not in the logical tree.  The DataContext is only inherited by objects in the logical tree, but the DateCheck object returned ValidDateRange is not in the tree (and it doesn't even have a DataContext property!). " 
Поэтому за назначением контекста данных параметра ValidationParameters придется следить в коде.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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