2010-04-15 12 views
7

ich eine Kontrolle mit dieser Validierung habenWPF ValidationRule Validate, wenn die Steuerung geladen wird

<MyPicker.SelectedItem> 
<Binding Path="Person.Value" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"> 
    <Binding.ValidationRules> 
    <rules:MyValidationRule ValidationType="notnull"/> 
    </Binding.ValidationRules> 
</Binding> 
</MyPicker.SelectedItem> 

Dies ist die Validation Klasse:

class MyValidationRule : ValidationRule 
{   
private string _validationType; 
public string ValidationType 
{ 
    get { return _validationType; } 
    set { _validationType = value; } 
} 

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{    
    ValidationResult trueResult = new ValidationResult(true, null); 

    switch (_validationType.ToLower()) 
    { 
    case "notnull": return value == null ? new ValidationResult(false, "EMPTY FIELD") : trueResult;    
    default: return trueResult; 
    } 
} 
} 

Frage: Wenn die Eigenschaft geändert wird, dann wird die Validate () Methode wird aufgerufen, die korrekt ist.

Aber diese Methode ganz am Anfang aufrufen, wenn das MyControl erstellt wird? Ich brauche sofort nach initialize zu beweisen, wenn die dort in der Steuerung ein Nullwert ist (und einen Überprüfungsfehler angezeigt)

Antwort

16

OK Ich habe es gelöst: Sie die Validierung erzwingen, wenn das Element mit einer einfachen Eigenschaft gebunden wurde - ValidatesOnTargetUpdated:

<rules:MyValidationRule ValidatesOnTargetUpdated="True" ValidationType="notnull"/> 
1

Ihre Antwort ist großartig ... ich will nur sagen.

Ich habe so viele Steuerelemente zu validieren und so viele Regeln, was ich tat, war ein Konstruktor in meiner ValidationRule-Klasse erstellen und die ValidatesOnTargetUpdated auf True in dort.

So muss ich nicht alle meine Seiten und Steuerelemente durchlaufen, um diese Eigenschaft der Validierungsregel hinzuzufügen.

examlpe

public class MyRule : ValidationRule 
{ 
    public MyRule() : base() { ValidatesOnTargetUpdated = true; } 
    ... 
} 

public class MyRule2 : MyRule 
{ 
    public MyRule2() : base() { } 
    ... 
} 
Verwandte Themen