2017-02-22 27 views
0

У меня есть текстовое поле, которое привязывается к правилу проверки. Я могу показать красную границу, когда Validation.HasError является Правдаwpf- зеленая граница с галочкой для правильного текстового поля с использованием Validation.HasError или другим способом

Однако, я не в состоянии отображать зеленую границу, когда пользовательский ввод правильно, и я нашел, что, потому что мой Trigger свойство отвечено на Validation.HasError и Validation.HasError НЕ ЛОЖЬ, если нет ошибки проверки.

Интересно, есть ли подходящий способ или обходной путь для достижения этого?

ответ

1

Вы можете установить по умолчанию Границу как зеленый, изменить ее в триггере, когда Validation.HasError истинно.

Используя msdn exapmle, вы можете установить BorderBrush и BorderThickness в стиле:

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderBrush" Value="Green"/> 
     <Setter Property="BorderThickness" Value="2"/> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
      Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
          Path=(Validation.Errors)[0].ErrorContent}"/> 
       <Setter Property="BorderBrush" Value="Red"/> 
      </Trigger> 
      <Trigger Property="TextBox.Text" Value=""> 
       <Setter Property="BorderBrush" Value="Yellow"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Другие части кода являются

<TextBox Name="textBox1" Width="50" Height="30" FontSize="15" DataContext="{Binding}" 
     Validation.ErrorTemplate="{StaticResource validationTemplate}" 
     Style="{StaticResource textBoxInError}" 
     Grid.Row="1" Grid.Column="1" Margin="2"> 
     <TextBox.Text> 
      <Binding Path="Age" 
      UpdateSourceTrigger="PropertyChanged" > 
       <Binding.ValidationRules> 
        <local:AgeRangeRule Min="21" Max="130"/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 

и

public class AgeRangeRule : ValidationRule 
{ 
    private int _min; 
    private int _max; 

    public AgeRangeRule() 
    { 
    } 

    public int Min 
    { 
     get { return _min; } 
     set { _min = value; } 
    } 

    public int Max 
    { 
     get { return _max; } 
     set { _max = value; } 
    } 


    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     int age = 0; 

     try 
     { 
      if (((string)value).Length > 0) 
       age = Int32.Parse((String)value); 
     } 
     catch (Exception e) 
     { 
      return new ValidationResult(false, "Illegal characters or " + e.Message); 
     } 

     if ((age < Min) || (age > Max)) 
     { 
      return new ValidationResult(false, 
       "Please enter an age in the range: " + Min + " - " + Max + "."); 
     } 
     else 
     { 
      return new ValidationResult(true, null); 
     } 
    } 
} 
+0

есть способ, которым я мог бы избегать зеленого цвета по умолчанию? Поскольку я хочу нормальный текстовый ящик, когда он пуст – mark

+0

Добавьте еще один триггер в стиль, чтобы рассмотреть больше случаев. См. Мое редактирование. – Ron

+0

Обратите внимание, что в этом примере вы должны использовать Nullable int (int?) Для свойства Age. – Ron

 Смежные вопросы

  • Нет связанных вопросов^_^