2010-11-10 5 views
2

J'utilise une règle de validation personnalisée pour valider mes données. Mais je ne peux pas accéder/déterminer la valeur de la propriété.WPF Obtenir une valeur réelle à partir d'une règle de validation personnalisée

ici est mon code

public class MandatoryRule: ValidationRule 
{ 
    public MandatoryRule() 
    { 
     ValidationStep = System.Windows.Controls.ValidationStep.UpdatedValue; 
    } 

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     BindingExpression exp = value as BindingExpression; 

     if (value == null) 
      return new ValidationResult(true, null); 

     return new ValidationResult(true, null); 
    } 
} 

Je dois régler la ValidationStep à UpdatedValue (pour plus logique métier)

Puis vient le problème: Je ne sais pas quelle est la valeur de la propriété? Parce que:

  1. Il est un validateur générique, ne peut pas liée à un modèle spécifique
  2. La valeur du paramètre de la méthode Valider est un BindingExpression

Alors, comment puis-je lire la valeur réelle ?

Merci

Répondre

1

Enfin, je viens avec cette idée.

Créez une classe DummyObject: DependencyObject. Créez un public DependencyProperty DummyProperty statique.

Créez ensuite un nouveau lien de données, copiez la source, le chemin de liaison, le nom de l'élément, le convertisseur, etc. à partir de la valeur (en tant que BindingExpression) .ParentBinding.

Définissez la nouvelle cible de liaison de données sur l'objet factice.

Utilisez ensuite la liaison à UpdateTarget()

Et maintenant, vous pouvez accéder à la valeur de la dummyproperty.

1

A eu le même problème et est venu à travers cette question, la réponse de Gary semble être la voie à suivre, mais il lui manquait le code source. Alors voici mon interprétation.

public class BindingExpressionEvaluator : DependencyObject 
{ 
    public object Value 
    { 
     get { return (object)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("ValueProperty", typeof(object), 
     typeof(BindingExpressionEvaluator), new UIPropertyMetadata(null)); 

    public static object Evaluate(BindingExpression expression) 
    { 
     var evaluator = new BindingExpressionEvaluator(); 
     var binding = new Binding(expression.ParentBinding.Path.Path); 
     binding.Source = expression.DataItem; 
     BindingOperations.SetBinding(evaluator, BindingExpressionEvaluator.ValueProperty, binding); 
     var value = evaluator.Value; 
     BindingOperations.ClearBinding(evaluator, BindingExpressionEvaluator.ValueProperty); 
     return value; 
    } 
}