2017-10-06 8 views
0

J'ai un TextBox avec liant Mo propriété:WPF MVVMLight Setter pas tiré sur la liaison TextBox lorsque la règle de validation est invalide

<TextBox> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Style.Setters> 
       <Setter Property="Text"> 
        <Setter.Value> 
         <Binding Path="Mo" UpdateSourceTrigger="PropertyChanged"> 
          <Binding.ValidationRules> 
           <validator:FloatPositiveValidationRule ValidatesOnTargetUpdated="True" /> 
          </Binding.ValidationRules> 
         </Binding> 
        </Setter.Value> 
       </Setter> 
      </Style.Setters> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

Celui-ci contient une règle de validation qui valide le contrôle que si la valeur est pas vide et supérieur à 0:

public class FloatPositiveValidationRule : ValidationRule 
{   
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     string str = (string)value; 

     if (str.Length > 0) 
     { 
      double mo = Double.Parse(str.Replace(".", ",")); 

      if (mo > 0) 
       return new ValidationResult(true, null); 
      else 
       return new ValidationResult(false, "Must be greater than 0"); 
     } 
     else 
      return new ValidationResult(false, "Empty"); 
    } 
} 

Dans mon modèle de vue, lorsque la validation est faux, le poseur ne se déclenche pas:

private double? _mo; 
public string Mo 
{ 
    get { return _mo.ToString(); } 

    set 
    { 
     if (value != "") 
      mo = double.Parse(value.Replace(".", ",")); 

     Set(ref _mo, mo); 
    } 
} 

Est-il possible d'entrer dans le setter même si la validation est invalide?

Répondre

1

Vous pouvez essayer de mettre ValidationStep propriété à UpdatedValue:

<validator:FloatPositiveValidationRule ValidatesOnTargetUpdated="True" ValidationStep="UpdatedValue" /> 

Cela devrait faire fonctionner la règle de validation après la propriété source a été définie.

Mais ce que vous devez faire est de supprimer le ValidationRule et implémenter la logique de validation dans votre modèle de vue, par exemple en implémentant l'interface INotifyDataErrorInfo.