WPF / Validieren einer Textboxeingabe?

keks1984

Erfahrenes Mitglied
hi @all,

also ich hab keine Ahnung ob ich hier richtig bin ABER ich hab ein Problem.

Ich hab mit WPF mein Projekt gemacht und da sind ganz viele Textboxen in die der Benutzer seine Eingaben eingibt. Jedenfalls soll der Benutzer ja nicht jeden Mist da eingeben also würde ich das gern kontrollieren. Bis jetzt dachte ich "HAJA kein Problem" aber HALLO gibts den in diesem WPF keine Validierung?

Kann mir bitte jemand sagen wie er / sie die Textboxeingabe kontrolliert?! Natürlich könnte ich im Codebehind auch kontrollieren aber gibts den da kein spezielles Tag in diesem xaml-Code? :(

LG
 
Danke Norbert aber diesen Abschnitt hab ich auch schon gefunden bloss kann ich nicht wirklich was mit anfangen, daher wärs hilfreich gewesen jemand zu finden der es auch schon gemacht hat.
 
Hast du es probiert? Womit genau hast du Schwierigkeiten? Ein wenig mehr Informationen wären natürlich hilfreich, damit ich dir auch tatsächlich helfen kann.
 
1. Problem ist glaub ich einfach mal dass ich nicht versteh was das alles soll. Also sprich ich möchte ja einfach kontrollieren ob der Benutzer ein Datum eingibt aber wozu soll ich dann die TextBox auf eine Datenquelle binden?

Hab dann einfach mal das

Code:
<TextBox Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}">
    <TextBox.Text>
        <Binding Path="Name">
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

in mein Projekt eingefügt um zu testen was das macht. Leider ohne Erfolg weil er mir dann einfach nur sagt dass er das er "TextBoxErrorTemplate" nicht auflösen kann.
 
Du bindest das TextControl nur an eine ValidationRule. Diese ist zuständig, den Inhalt der TextBox zu auf Gültigkeit zu überprüfen. So läuft das unter WPF.
 
OK aber 1. welches TextControl und 2. nach welchen Regeln überprüft diese ValidationRule? Also sprich ich muß der ja dann irgendwie sagen dass die eingabe ein Datum sein soll.
 
Die Textcontrols (man nenne sie TextBoxen), die du validieren möchtest.

Die Methode Validate muss überschrieben werden und diese kann genau deine gewünschte Validierung enthalten. Damit wird dann geprüft.
 
Sorry dass ich mich etwas blöd anstelle aber hab grad im Moment kein blassen Schimmer!

Also ich hab jetzt mal anhand nem Beispiel was probiert da kommt aber nichts bei raus!

Hab im C# Code folgendes eingefügt:

Code:
namespace MyValidators
{
	public class StringRangeValidationRule : ValidationRule
	{
		private int _minimumLength = -1;
		private int _maximumLength = -1;
		private string _errorMessage;

		public int MinimumLength
		{
			get { return _minimumLength; }
			set { _minimumLength = value; }
		}

		public int MaximumLength
		{
			get { return _maximumLength; }
			set { _maximumLength = value; }
		}

		public string ErrorMessage
		{
			get { return _errorMessage; }
			set { _errorMessage = value; }
		}

		public override ValidationResult Validate(object value,
			System.Globalization.CultureInfo cultureInfo)
		{
			ValidationResult result = new ValidationResult(true, null);
			string inputString = (value  string.Empty).ToString();
			if (inputString.Length < this.MinimumLength ||
				   (this.MaximumLength > 0 &&
					inputString.Length > this.MaximumLength))
			{
				result = new ValidationResult(false, this.ErrorMessage);
			}
			return result;
		}
	}
}

und im xaml hab ich dies eingefügt:

Code:
<Window xmlns:validators="clr-namespace:MyValidators" >

Code:
<TextBox Height="30" Width="100">
	<Binding Path="Name">
		<Binding.ValidationRules>
		         <validators:StringRangeValidationRule 
		            MinimumLength="1" 
		            ErrorMessage="A name is required." />
		</Binding.ValidationRules>
	</Binding>
</TextBox>

Der macht da jetzt echt gar nix ich hab einfach die Textbox und da kann ich reinmachen was ich will aber tut sich nix! Brauch ich einen OK Button? Denke ich ja nicht also zumindest hatte ich das bis jetzt in anderen Projekten immer so, dass das sofort nachdem was falsches drin steht erkannt wird.
 
Also bei WPF ist Binding sehr wichtig. Daher empfiehlt es sich eine eigene Klasse zu implementieren, welche in Form eines Objektes dann die anzuzeigenden Daten enthält. Dieses wird dann an die entsprechenden Felder gebunden und somit sind dann auch Dinge wie ValidationRules möglich. Hier ein Beispiel wie dies aussehen kann.

Eine ValidationRule für Datumswerte
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace ValidationRuleDemo
{
    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;
        }
    }
}

Dann wird eben eine Datenklasse benötigt, welche die anzuzeigenden Daten repräsentiert.
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ValidationRuleDemo
{
    public class MyData
    {
        private string _date;

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

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

Schließlich noch das XAML für das Window, in welchem die Textfelder positioniert werden, die Bindings, Styles und wo auch unser Datencontainer definiert wird, der in Form unserer Datenklasse besteht:
Code:
<Window x:Class="ValidationRuleDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:ValidationRuleDemo"
    Title="Window1" Height="300" Width="300">
    
    <Window.Resources>
        <my:MyData x:Key="md"/>
        
        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="14">!</TextBlock>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>

        <Style x:Key="textBoxInError" 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>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Content="Enter a valid Date" Target="{Binding ElementName=textBox1}" />
        <TextBox Grid.Row="1" Name="textBox1" Width="75"
            HorizontalAlignment="Left"
            Validation.ErrorTemplate="{StaticResource validationTemplate}"
            Style="{StaticResource textBoxInError}"
            Margin="2">
                <TextBox.Text>
                    <Binding Path="Date" Source="{StaticResource md}"
                        UpdateSourceTrigger="PropertyChanged" >
                        <Binding.ValidationRules>
                            <my:DateTimeValidationRule/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
        </TextBox>
        <Label x:Name="label2" Grid.Row="2" Content="Enter your firstname" Target="{Binding ElementName=textBox2}"/>
        <TextBox x:Name="textBox2" Grid.Row="3"/>
    </Grid>
</Window>
Bei der laufenden Eingabe des Datumswertes wird nun überprüft, ob der Wert korrekt ist, wenn nicht, wird er in roter Farbe dargestellt und die Fehlermeldung ist in einem ToolTip ersichtlich.
 

Neue Beiträge

Zurück