The Artima Developer Community
Sponsored Link

.NET Buzz Forum
WPF: Validierung von Eingaben

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
WPF: Validierung von Eingaben Posted: Jan 16, 2008 2:03 AM
Reply to this message Reply

This post originated from an RSS feed registered with .NET Buzz by -.
Original Post: WPF: Validierung von Eingaben
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
Eingaben sollten immer validiert, also auf Korrektheit überprüft, werden, um Fehler bereits frühzeitig abzufangen und so eventuell einen langen Verarbeitungsweg einzusparen. Dieser Artikel zeigt, wie die Eingabe von Datumswerten in Textfelder unter WPF auf Gültigkeit hin überprüft werden können.

Einführung


In der Windows Presentation Foundation gibt es die sogenannten ValidationRules, welche an einem Databinding hängen und darüber auch verwendet werden können. Mit Hilfe dieser ValidationRules können nun Eingaben auf einfache Art und Weise überprüft werden. Es wird jedoch vorausgesetzt, dass der zu prüfende Wert per Databinding an das jeweilige Control gebunden wurde.

Erstellung einer ValidationRule


Das Erstellen einer ValidationRule ist sehr einfach gehalten. Dazu muss von der abstrakten Klasse System.Windows.Controls.ValidationRule abgeleitet werden. Weiters muss die abstrakte Methode Validate überschrieben werden. Diese bekommt als Parameter den geänderten Wert der Eingabe übermittelt, welcher in weiterer Folge überprüft werden muss. Als Ergebnis wird ein Objekt des Typs ValidationResult zurück geliefert. Darin wird vermerkt, ob die Validierung erfolgreich war (oder nicht) und ein Fehlerobjekt (das kann beispielsweise eine Fehlermeldung sein).

Für das hier gezeigte Beispiel wird eine ValidationRule für die Validierung eines Datums implementiert und kann wie folgt aussehen:
public class DateTimeValidationRule : ValidationRule
{
    public override ValidationResult Validate(
        object value, 
        System.Globalization.CultureInfo cultureInfo)
    {
        string val = value as string;
        DateTime dtResult;
        bool bRet = DateTime.TryParse(val, out dtResult);
        ValidationResult vr = new ValidationResult(bRet, "No valid date");
        return vr;
    }
}

Damit ist die notwendige ValidationRule erstellt. Da diese jedoch nur auf ein Binding angewendet werden kann, wird noch eine Datenklasse benötigt, welche den entsprechenden Wert an unser Textfeld bindet.

Binding erstellen


Für das Binding wird eine einfache Datenklasse erstellt. Diese enthält nur den angezeigten Datumswert und wird bei der Instanzierung mit dem aktuellen Datum befüllt (siehe Konstruktor).
public class MyData
{
    private string _date;

    public string Date
    {
        get { return _date; }
        set { _date = value; }
    }

    public MyData()
    {
        _date = DateTime.Now.ToShortDateString();
    }
}

Der nächste Schritt besteht nun darin, ein Window mit den entsprechenden Feldern und dem Binding zu erstellen.

WPF Window und Bindings erstellen


Für das Fenster der Testanwendung müssen einige kleine Punkte erledigt werden. So ist die Datenquelle anzubinden, eine TextBox zu erstellen und das DataBinding zu setzen. Weiters muss dem DataBinding die ValidationRule bekannt gemacht werden, sowie ein entsprechender Trigger gesetzt werden (PropertyChanged). Letztere Schritt wird benötigt, um Änderungen an der Eingabe zu erkennen und dadurch die Validierung zu starten.
<Window.Resources>
    <my:MyData x:Key="md"/>
    
    <ControlTemplate x:Key="validationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" 
                       FontSize="14">!</TextBlock>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>

    <Style x:Key="ErrorTextBoxStyle" 
           TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" 
                     Value="true">
                <Setter 
                    Property="ToolTip" 
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                    Path=(Validation.Errors)[0].ErrorContent}"/>
                <Setter 
                    Property="Foreground" 
                    Value="Red"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

In den Ressourcen für das Window wird im ersten Schritt die Datenquelle für das Binding angegeben. my ist lediglich ein Namespace, welcher auf das aktuelle Projekt verweist, damit die Klasse MyData gefunden werden kann.

Interessant ist der definierte Style, welcher an den Typ TextBox gebunden wird und einen Trigger auf die Eigenschaft Validation.HasError besitzt. Dieser wird also immer dann ausgelöst, wenn die Validierung einen Fehler zurück liefert. Ist dies der Fall, wird die Schriftfarbe gesetzt, als auch der ToolTip befüllt (dieser ist zuständig, um die zurück gelieferte Fehlermeldung anzuzeigen).

Schließlich fehlt noch die Definition des Textfeldes, welches der grundlegende Bestandteil dieser Demo ist.
<TextBox Grid.Row="1" Name="textBox1" Width="75"
    HorizontalAlignment="Left"
    Validation.ErrorTemplate="{StaticResource validationTemplate}"
    Style="{StaticResource ErrorTextBoxStyle}"
    Margin="2">
        <TextBox.Text>
            <Binding Path="Date" Source="{StaticResource md}"
                UpdateSourceTrigger="PropertyChanged" >
                <Binding.ValidationRules>
                    <my:DateTimeValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
</TextBox>

Es wird deutlich, dass hier sowohl ein ErrorTemplate zugewiesen wird und ein entsprechender Style. Zudem findet ein Binding auf unsere zuvor definierte Datenquelle statt. Dieser wird ein UpdateSourceTrigger zugewiesen, der bei einer Veränderung des eingegebenen Wertes die ValidationRule startet. In diesem Fall DateTimeValidationRule, welche zu Beginn dieses Artikels erstellt wurde.

Der Rest besteht eigentlich nur darin, um die TextBox herum die grundlegenden Bestandteile eines Fensters zu definieren. In diesem Beispiel wurde mit einem Grid gearbeitet, was durchaus auch an der Definition des Textfeldes zu erkennen ist.

Fazit


Mit diesem Beispiel sollte es nun möglich sein, eigene Validierungen für Felder zu implementieren. Es ist durchaus sinnvoll, ein wenig mit dem oben gezeigten Code zu experimentieren und einige Einstellungen etc. zu ändern, um daraus zu lernen.

Read: WPF: Validierung von Eingaben

Topic: MS CRM ListView Webpart Bug?? Previous Topic   Next Topic Topic: Anwendungen und Dokumente ultraschnell starten

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use