2017-01-23 5 views
1

in WPF auf TextBox Wert abhängig Set ich einige TextBox habe „kontrolliert“ durch einen Bereich Validator:ein RangeValidator Minimum

public class RangeValidator : ValidationRule 
{ 

    public int Min { get; set; } 
    public int Max { get; set; } 
    public bool CheckZeroValue { get; set; } 

    public RangeValidator() { } 

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

    try 
    { 
     if (((string)value).Length > 0) 
     Value = Int32.Parse((String)value); 
    } 
    catch (Exception e) 
    { 
     return new ValidationResult(false, "Wrong Character - " + e.Message); 
    } 

    if (CheckZeroValue && (Value == 0)) 
     return new ValidationResult(true, null); 

    if ((Value < Min) || (Value > Max)) 
    { 
     return new ValidationResult(false, String.Format("The range is: {0} - {1}", Min, Max));    
    } 
    else 
    { 
     return new ValidationResult(true, null); 
    } 
    } 
} 

Nun, was ich tun möchte, ist, dass, wenn der Benutzer ein Textfeld Wert ändern, die Mindest der onother Textbox wird accordigly geändert, so etwas wie diese ..

<TextBox Grid.Row="1" Grid.Column="1" MaxLength="2" Name="FLD_OPEN_SNS_MIN"> 
    <TextBox.Text> 
     <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MIN]' 
       UpdateSourceTrigger="PropertyChanged" 
       NotifyOnValidationError="True" 
       ValidatesOnExceptions="True" > 
     <Binding.ValidationRules> 
      <local:RangeValidator Min="10" Max="50"/> 
     </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
    </TextBox> 

    <TextBox Grid.Row="2" Grid.Column="1" MaxLength="3" Margin="5" > 
    <TextBox.Text> 
     <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MAX]' 
       UpdateSourceTrigger="PropertyChanged" 
       NotifyOnValidationError="True" 
       ValidatesOnExceptions="True" > 
     <Binding.ValidationRules> 
      <local:RangeValidator Min="{Binding ElementName=FLD_OPEN_SNS_MIN, 
               Path=Text 
               Converter={StaticResource StringToIntConverter}}" Max="50"/> 
     </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
    </TextBox> 

das funktioniert nicht, weil ValidationRule-Klasse kein DependencyObject ist. Gibt es eine Möglichkeit, dies zu erreichen, ohne den Code zu verwenden?

Antwort

1

Dies funktioniert nicht, da die ValidationRule-Klasse kein DependencyObject ist. Gibt es eine Möglichkeit, dies zu erreichen, ohne Code zu verwenden?

Sie könnten eine Wrapper-Klasse erstellen, die von DependencyObject abgeleitet ist und eine Abhängigkeitseigenschaft verfügbar macht. Weitere Informationen finden Sie im folgenden TechNet-Artikel.

WPF: ein Data Bound Wert zu einem Gültigkeitsregel Passing:https://social.technet.microsoft.com/wiki/contents/articles/31422.wpf-passing-a-data-bound-value-to-a-validation-rule.aspx

<TextBox Grid.Row="2" Grid.Column="1" MaxLength="3" Margin="5"> 
    <TextBox.Resources> 
     <local:BindingProxy x:Key="proxy" Data="{Binding ElementName=FLD_OPEN_SNS_MIN}"/> 
    </TextBox.Resources> 
    <TextBox.Text> 
     <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MAX]' 
       UpdateSourceTrigger="PropertyChanged" 
       NotifyOnValidationError="True" 
       ValidatesOnExceptions="True" > 
      <Binding.ValidationRules> 
       <local:RangeValidator Max="50"/> 
       <local:RangeValidator.Wrapper> 
        <local:Wrapper Min="{Binding Path=Text, Source={StaticResource proxy}, Converter={StaticResource StringToIntConverter}}"/> 
       </local:RangeValidator.Wrapper> 
      </Binding.ValidationRules> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
+0

vielen Dank @ mm8! – Barzo