2017-02-22 4 views
0

Ich habe ein Textfeld, das an eine Validierungsregel bindet. Ich bin in der Lage rot umrandet angezeigt wird, wenn Validation.HasError Truewpf- grüner Rahmen mit Häkchen für korrektes Textfeld mit Validation.HasError oder einem anderen Weg

Ich bin aber grüne Grenze angezeigt werden nicht in der Lage, wenn Benutzereingaben korrekt ist, und ich fand, dass, weil meine Trigger-Eigenschaft replys auf Validation.HasError und Validation.HasError ist NICHT False, wenn kein Validierungsfehler vorliegt.

Ich frage mich, ob es einen richtigen Weg oder Workaround gibt, um dies zu erreichen?

Antwort

1

Sie können den Standardrahmen auf Grün setzen und ihn in Trigger ändern, wenn Validation.HasError wahr ist.

Mit msdn exapmle können Sie BorderBrush und BorderThickness im Stil gesetzt:

<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> 

Andere Teile des Codes sind

<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> 

und

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

gibt es eine Möglichkeit, ich könnte Grün als Standard vermeiden? da ich normales Textfeld haben möchte, wenn es leer ist – mark

+0

Fügen Sie einen weiteren Auslöser zum Stil hinzu, um weitere Fälle zu berücksichtigen. Siehe meine Bearbeitung. – Ron

+0

Beachten Sie, dass Sie in diesem Beispiel Nullable int (int?) Für die Age-Eigenschaft verwenden sollten. – Ron

Verwandte Themen