Data Binding, validation- Luento 12
Tutustutaan WPF:n tapaan validoida syötteitä
Luentoesimerkki (luento12.zip)
Binding-esimerkki (binding.zip)
- Luentovideo (Youtube)
- tjlahton2012-02-24_1518.mp4 16.5 Mt
- tjlahton2012-02-24_1518.wmv 22.3 Mt
- tjlahton2012-02-24_1518.mp3 6.7 Mt
ExceptionValidationRule
Suoraan WPF:ssä toimii ExceptionValidationRule eli syötteen aiheuttaessa poikkeuksen esitetään kenttä virheellisenä punaisella reunuksella. Toiminnan edellytyksenä on, että TextBox on bindattu johonkin dependency propertyyn. Jos kenttään syötetään tietoa jota property ei osaa tulkita saadaan aikaiseksi poikkeus. Esim. int-tyyppiseen propertyyn yritetään syöttää tekstiä.
<TextBox Height="23" HorizontalAlignment="Left" Margin="0,00,0,0" Name="textBox2" VerticalAlignment="Top" Width="120"> <TextBox.Text> <Binding ElementName="ikkuna" Mode="OneWay" Path="Laskuri" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <ExceptionValidationRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
Omat validointisäännöt
Voidaan käyttää myös omia validointisääntöjä joita voi olla yksi tai useampia. Kaikki säännöt käydään läpi ja jos kaikki menevät virheettä läpi niin syöte on ok.
<TextBox Height="23" HorizontalAlignment="Left" Margin="00,0,0,0" Name="textBox1" VerticalAlignment="Top" Width="120"> <TextBox.Text> <Binding ElementName="ikkuna" Path="Laskuri" Mode="OneWayToSource" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <c:PositiveNumberRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
Omat validointisäännöt täytyy kirjoittaa luokaksi, joka peritään ValidationRule-luokasta:
class PositiveNumberRule : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { int luku = 0; try { luku = Convert.ToInt16(value); ; } catch (FormatException) { return new ValidationResult(false, "Value is not a valid integer."); } if (luku <= 0) { return new ValidationResult(false, "Please enter a positive integer."); } else { return ValidationResult.ValidResult; } } }
Virheilmoitustekstien näyttämiseen tarvitaan tyylejä ja triggereitä joita käsitellään myöhemmin
Binding
- BindingMode - määrää mihin suuntaan tietoja päivitetään vaiko molempiin suuntiin
- UpdateSourceTrigger - määrää missä vaiheessa päivitys tehdään eli tehdäänkö syötettäessä vai vasta kentästä poistuttaessa
Luodaan dynaamisesti TextBox ja bindataan se Laskuri-nimiseen dependency propertyyn.
TextBox malliTextBox = new TextBox(); malliTextBox.Width = 100; malliTextBox.Height = 30; malliTextBox.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; malliTextBox.VerticalAlignment = System.Windows.VerticalAlignment.Bottom; panel.Children.Add(malliTextBox); malliTextBox.Text = "-500"; Binding myBinding = new Binding(); myBinding.Source = this; // MainWindow tietolähteeksi myBinding.Path = new System.Windows.PropertyPath("Laskuri"); // viitataan Laskuri-propertyyn myBinding.Mode = BindingMode.TwoWay; myBinding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus; // bindataan malliTextBoxin Text-ominaisuus malliTextBox.SetBinding(TextBox.TextProperty, myBinding); myBinding.ValidationRules.Add(new PositiveNumberRule());
Käyttäjien kommentit