2015-10-15 15 views
14

z konwerterem, mogę rozróżnić co najmniej 4 rodzajów zachowań dotyczących aktualizacji wartości źródło:WPF: Walidacja vs. Konwertery

  • konwersja do odpowiedniej wartości (-> źródło aktualizacji)
  • powrocie zerowy (-> wskazać błąd)
  • rzuca wyjątek i aktywowanie reguły walidacji (wyjątek -> wskazać błąd)
  • powracającego Binding.DoNothing (-> nie aktualizuje źródła, ale nie wskazują błędu Eiter)

Z ValidationRule mogę dyskryminować tylko między sukcesem (-> źródła aktualizacji) i awarii (-> nie aktualizują źródła), ale nie mogę symulować zachowanie, który jest skojarzony z Binding.DoNothing

Czy istnieje sposób użycia ValidationRule w sposób podobny do zachowania konwerterów w trybie Binding.DoNothing?

+0

Czy powiązanie nie jest aktualizowane, a styl elementu interfejsu użytkownika nie ulega zmianie? –

Odpowiedz

8

Intencje Converters i ValidationRules są całkiem różne. Konwertery pobierają jedną wartość i przechodzą do innej. Wspomniane 4 przypadki są dość częste do konwersji: zrób to; powiedz, że jest puste; wysadzić w powietrze; ignorować. Jednak ValidationRules to tak/nie rzeczy - są poprawne lub nie. Chociaż może być sens mieć opcję "ignoruj", nie ma takiej.

Najbliżej semantycznie byłoby ustawić IsValid = true w konstruktorze, ale nie jest to dokładnie to, co chcesz.

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); 
} 

Ostatnia myśl, którą mam, to jeśli potrzebujesz specjalnych przypadków, a try-catch lub inna logika wysadzi się w powietrze. Jedyne co mogę wymyślić to sprawdzanie typu w ValidationRule, co jest dość wątpliwe, ponieważ tworzysz niepożądaną zależność, ale pomijasz problemy. tj.

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

HTH!

AKTUALIZACJA

Albo jak to około 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

W takim przypadku, czy byłoby sens ignorować ValidationRule? – Domysee