2011-09-05 14 views
5

mam ów sterujących dziedziczy tekstowymValidationRules w szablonie kontroli

public class MyTextBox : TextBox 

To ma styl

<Style TargetType="{x:Type Controls:MyTextBox}"> 

jednym z seterów jest

<Setter Property="Template"> 

Chcę, aby móc ustaw Binding.ValidationRules na coś w szablonie, co wpłynie na wszystkie wystąpienia tego typu tekstu wół. W związku z tym mogę utworzyć pola tekstowe na oznaczenie Times, Dates, Numerics, post/zip .. lub cokolwiek chcę,

Nie chcę ustawiać reguł sprawdzania poprawności za każdym razem, gdy utworzę pole tekstowe. Chcę tylko powiedzieć, że chcę NumericTextBox i sprawdzenie go w dowolny sposób ustawiony w szablonie.

Czy to możliwe?

Wszystko, co widziałem do tej pory, to ustawienia sprawdzania poprawności ustawione dla każdego wystąpienia formantu, np.

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}> 
<TextBox.Text> 
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" > 
     <Binding.ValidationRules> 
      <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

(od http://www.wpftutorial.net/DataValidation.html)

Odpowiedz

1

Nie jestem pewien, czy można zrobić dokładnie to, co chcesz. Możesz być w stanie zrobić to z dużą ilością oszustów w ustawieniach nieruchomości (nie będę się na tym opierał, ponieważ wymagałoby to modyfikacji powiązań, które z definicji są dynamiczne) lub z kodem za/niestandardowymi kontrolkami.

Zamiast tego sugeruję, abyś popchnął swoją walidację do swojego ViewModel, prawdopodobnie z IDataErrorInfo. Istnieje wiele artykułów tam. Oto jeden z pierwszych I z znalezionych właśnie do „walidacji MVVM”:

MVVM - Validation

Rozwiązanie to pozwala na używanie standardowych technik kompozytorskich OO, więc można avoid repeating yourself :)

+0

Myślę, że daję to podejście –

4

Jak widać, zasady walidacji są wraz z wiązaniami. Natknąłem się na ten sam problem i rozwiązanie działa dla mnie było zrobić coś takiego:

public MyTextBox() 
    {    
     this.Loaded += new RoutedEventHandler(MyTextBox_Loaded); 
    } 

    void MyTextBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty); 
     binding.ValidationRules.Add(new MyValidationRule()); 
    } 

Problem polega na tym, aby mieć pewność, że wiązanie jest ustawione zanim dodamy regułę walidacji, stąd wykorzystanie Loaded , ale nie jestem pewien, czy to zadziała w każdym scenariuszu.

+0

Hmm . w porządku. więc jak to pasuje do mvvm. czy powinniśmy umieścić to wiążące i sprawdzające połączenie w kodzie? Czy byłoby tak łatwo/trudno wykonać każde wiązanie na Xaml i zapomnieć o szablonach w sposób jaki sobie wyobrażałem? –

+0

To podejście jest agnostyczne dla architektury i ma być używane do ogólnych walidacji, w przeciwnym razie nie widzę sensu tworzenia nowej klasy dziedziczącej z pola tekstowego. W twoim przykładzie musisz sprawdzić poprawny e-mail. Jeśli potrzebujesz weryfikacji danych aplikacji, zawsze powinieneś używać IDataErrorInfo. – Natxo

+0

Tak, myślę, że za pomocą usercontrols można mieć kod w kodzie. to kontrola użytkownika, wykonuje określoną pracę i może zapewnić, że jej dane są poprawne. –