WPF / XAML: ExceptionValidationRule отличается при применении в коде против разметки? - PullRequest
2 голосов
/ 17 декабря 2010

Я столкнулся с необходимостью применить ExceptionValidationRule ко многим текстовым полям в форме в WPF.Я могу сделать это с разметкой, и я получаю желаемый результат (текстовое поле получает красный контур при вводе недопустимого значения), но только когда я задаю правило в разметке:

<TextBox x:Name="Name" Width="150" >
    <TextBox.Text>
         <Binding Path="Name" Mode="TwoWay"  UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
              <Binding.ValidationRules>
                   <ExceptionValidationRule />
              </Binding.ValidationRules>
         </Binding>
    </TextBox.Text>
 </TextBox>

Но когда я применяюзначение с помощью кода:

Name.GetBindingExpression(TextBox.TextProperty).ParentBinding.ValidationRules.Add(new ExceptionValidationRule());

Я не получаю желаемых результатов.Этот код применяется в конструкторе userControl после вызова InitalizeComponent ().Пользовательский элемент управления имеет текстовое поле «Имя» в качестве дочернего элемента управления.

Я прошел, и при использовании обоих я вижу, что два правила проверки помещаются в коллекцию ValidationRules, но когда я использую тольковерсия кода Я не получаю желаемого результата в виде красного контура вокруг текстового поля при вводе недопустимого значения.

Я просто неправильно понимаю фундаментальное правило для WPF?

ИлиЕсть ли способ применить это правило проверки с помощью стиля?Я бы предпочел, чтобы сказать вам правду.

Спасибо, M

1 Ответ

2 голосов
/ 17 декабря 2010

Вы не можете изменить привязку после того, как она была использована, и, в свою очередь, это относится и к ValidationRules.Вы можете создать новый Binding в коде, но это, вероятно, не то, что вам нужно.

Binding binding = new Binding("Name");
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
binding.NotifyOnValidationError = true;
binding.ValidationRules.Add(new ExceptionValidationRule());
nameTextBox.SetBinding(TextBox.TextProperty, binding);

Стиль не будет работать, поскольку Binding или ValidationRule не являются производными от FrameworkElement.Что бы я сделал в вашей ситуации - это подклассное связывание, куда вы добавляете все, что вам нужно.Примерно так

<TextBox x:Name="Name" Width="150" >    
    <TextBox.Text>    
        <local:ExBinding Path="Name"
                         Mode="TwoWay"
                         UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

ExBinding, добавление ValidationRule и т. Д.

public class ExBinding : Binding
{
    public ExBinding()
        : base()
    {
        NotifyOnValidationError = true;
        ValidationRules.Add(new ExceptionValidationRule());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...