2015-10-15 11 views
14

con un convertitore, posso distinguere tra un minimo di 4 tipi di comportamento per quanto riguarda l'aggiornamento del valore di origine:WPF: convalida Convertitori vs.

  • conversione a un valore appropriato (-> origine di aggiornamento)
  • nullo ritorno (-> indicano errore)
  • un'eccezione e attivare la regola di convalida eccezione (-> indicano errore)
  • ritorno Binding.DoNothing (-> non aggiornare fonte, ma non indicano errore Eiter)

Con un ValidationRule, posso distinguere solo tra il successo (-> origine di aggiornamento) e il fallimento (-> non aggiornare fonte), ma non riesco a simulare il comportamento che è associato con Binding.DoNothing

C'è un modo per utilizzare ValidationRule in un modo simile al comportamento Binding.DoNothing dei convertitori?

+0

Vuoi che il binding non sia aggiornato e lo stile dell'elemento ui non sia cambiato? –

risposta

8

Gli intenti di Convertitori e ValidationRules sono piuttosto diversi. I convertitori prendono un valore e lo trasformano in un altro. I 4 casi che hai citato sono abbastanza comuni per la conversione: fallo; dì che è nulla; saltare; ignorare. Tuttavia ValidationRules sono sì/no - sono validi o non lo sono. Mentre potrebbe avere senso avere un'opzione "ignora", non ce n'è uno.

Il più vicino semanticamente sarebbe quello di impostare IsValid = true nel costruttore, ma non è esattamente quello che vuoi.

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{ 
    try 
    { 
     // try normal setup/validation 
    } 
    catch 
    { 
     // handle exceptions, return false 
    } 
    // decide if you want to return false 
    // return true (equivalent to nothing/ignore) 
    return new ValidationResult(true, null); 
} 

ultimo pensiero che ho è se avete bisogno di casi particolari, e il try-catch o altra logica si esplodere. L'unica cosa che mi viene in mente è un controllo di tipo nel ValidationRule, che è piuttosto discutibile dal momento che stai creando una dipendenza indesiderata, ma eviterebbe i problemi. Ad esempio

if (value is SpecialType) 
{ 
    return new ValidationResult(true, null); 
} 

HTH!

AGGIORNATO

O come circa un IgnorableValidationRule?

public class IgnorableValidationRule : ValidationRule 
{ 
    public bool Ignore { get; set; } = false; 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if (Ignore) return new ValidationResult(true, null); 

     return new ValidationResult(false, "Why does everyone ignore me?"); 
    } 
} 

<TextBox.Text> 
    <Binding Path="Data"> 
     <Binding.ValidationRules> 
      <local:IgnorableValidationRule Ignore="True"/> <!-- na na --> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 
+1

In questo caso avrebbe senso ignorare un ValidationRule? – Domysee