Validation eines UserControles


Blackhawk50000

Erfahrenes Mitglied
#1
Hallo,

Ich habe ein UserControl erstellt welches eigentlich eine Normale Textbox sein soll, die aber ausschließlich Zahlen als Eingabe zulässt.
Da ich dies im Projekt sehr oft brauche habe ich ein Control bauen wollen. Aber irgendwie funktioniert das nicht so wie es soll. Neben kleiner anderer Probleme wie dem Anpassen der Größe der Textbox habe ich ein einscheidendes Problem beim Validieren.

Hier erstmal mein C# Code zur Textbox:
Hauptaugenmerk liegt hier auf der Texteigenschaft.

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Conplan_Silverlight_Controls
{
    public partial class NumTextBox : UserControl
    {

        #region Klassenvariablen

        /// <summary>
        /// Flag, ob Kommazahlen erfasst werden dürfen
        /// </summary>
        private bool _mitKommaEingabe = true;


        #endregion


        #region Konstruktor

        public NumTextBox()
        {
            InitializeComponent();
        }

        #endregion


        #region Eigenschaften

        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("TextProperty", typeof(string), typeof(NumTextBox), null);
        public string Text
        {
            get { return (string)GetValue(NumTextBox.TextProperty); }
            set { SetValue(NumTextBox.TextProperty, value); }
        }


        /// <summary>
        /// setzen der Maximalen Eingabelänge
        /// </summary>
        public int MaxLength
        {
            get { return txtBox.MaxLength; }
            set { txtBox.MaxLength = value; }           
        }


        /// <summary>
        /// TextAlignment setzen
        /// </summary>
        public TextAlignment TextAlignment
        {
            get { return txtBox.TextAlignment; }
            set { txtBox.TextAlignment = value; }            
        }


        /// <summary>
        /// Flag, ob auch Gleitkommazahlen eingegeben werden können
        /// </summary>
        public bool MitKommaEingabe
        {
            get { return _mitKommaEingabe; }
            set { _mitKommaEingabe = value; }
        }


        #endregion


        #region Eventlistener

        /// <summary>
        /// Funktion wird nach dem Laden des Controls aufgerufen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            txtBox.Width = NumTextBoxCtrl.Width;
            txtBox.Height = NumTextBoxCtrl.Height;
        }


        /// <summary>
        /// Fängt nichtnumerische Eingaben ab
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtBoxKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
	        switch (e.Key)
            {
		        case Key.Tab:
			        return;
                case Key.D0:
                    break;
                case Key.D1:
                    break;
                case Key.D2:
                    break;
                case Key.D3:
                    break;
                case Key.D4:
                    break;
                case Key.D5:
                    break;
                case Key.D6:
                    break;
                case Key.D7:
                    break;
                case Key.D8:
                    break;
                case Key.D9:
                    break;
                case Key.NumPad0:
                    break;
                case Key.NumPad1:
                    break;
                case Key.NumPad2:
                    break;
                case Key.NumPad3:
                    break;
                case Key.NumPad4:
                    break;
                case Key.NumPad5:
                    break;
                case Key.NumPad6:
                    break;
                case Key.NumPad7:
                    break;
                case Key.NumPad8:
                    break;
                case Key.NumPad9:
                    break;
                case Key.Decimal:
                    break;
                default:
                    if (e.PlatformKeyCode == 188 || e.PlatformKeyCode == 110 || e.PlatformKeyCode==43)
                    {
                        // Zeichen "," oder "," auf dem Numpad oder "," auf dem Mac
                        if (txtBox.Text.IndexOf(",") > -1)
                        {
                            // nicht mehr wie ein Komma eingebbar machen
                            e.Handled = true;
                            return;
                        }
                    }
                    else
                    {
                        e.Handled = true;
                        return;                        
                    }
                    break;
            }
        }
       

        /// <summary>
        /// Wird beim Ändern der Größe aufgerufen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LayoutRoot_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            txtBox.Width = NumTextBoxCtrl.Width;
            txtBox.Height = NumTextBoxCtrl.Height;
        }

        #endregion

    }
}

Der Dazugehörige XAMLCode sieht so aus:

HTML:
<UserControl x:Class="Conplan_Silverlight_Controls.NumTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="42" d:DesignWidth="90"
    Loaded="Page_Loaded" Name="NumTextBoxCtrl" HorizontalAlignment="Center" VerticalAlignment="Center">
    
    <TextBox Height="23" HorizontalAlignment="Left" x:Name="txtBox" VerticalAlignment="Top" Width="64" KeyDown="txtBoxKeyDown" />
</UserControl>

Nun habe ich folgendes mit diesem Teil vor.

Ich will das ganz normal wie eine normale Textbox validieren können. Also mit "INotifyPropertyChanged"

Datzu mache ich ja bei einer Normalen Textbox folgendes:

HTML:
<TextBox x:Name="tb_Name" Text="{Binding NeuerName, Mode=TwoWay, NotifyOnValidationError=True, UpdateSourceTrigger=Default, ValidatesOnExceptions=True}" Margin="142,28,0,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="150" d:LayoutOverrides="HorizontalAlignment" MaxLength="49"/>
Da funktioniert das auch Wunderbar.

Aber wenn ich das gleiche mit meiner NumTextBox mache, geht leider garnichts, bzw wird der Eingegebene text nicht erkannt oder was auch immer.

Leider haben bisher 3 Stunden www.gidf.de nicht viel gebracht außer kleinere Anhaltspunkte die leider nicht wirklich weiter geführt haben da niemand damit am ende Validieren wollte
 

Blackhawk50000

Erfahrenes Mitglied
#2
Also das hat sich ja mal Sowas von erledigt =).

Also wenn einer selber sowas braucht macht folgendes:

Erstellt euch eine einfache KLASSE (mehr nicht) und lasst die von (in meinem Beispiel) Textbox erbene

Public class MyBox :TextBox

und dort drinnen fügt ihr einfach eine Eigenschaft hinzu (wenn ihr eine Braucht).

Und überschreibt die zu überwachende Event (z.B. onKeyDown). Und Dadaaaa schon gehts wunderbar =)
 

Neue Beiträge