Required field Validation in WPF text box

16,934

You should bind the Text property of the TextBox to a property of a view model and implement the IDataErrorInfo interface in the view model class.

Please refer to the following sample code.

Code:

public partial class Window3 : Window
{
    Window3ViewModel viewModel = new Window3ViewModel();
    public Window3()
    {
        InitializeComponent();
        DataContext = viewModel;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        viewModel.Validate();
    }
}

public class Window3ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();

    public void Validate()
    {
        bool isValid = !string.IsNullOrEmpty(_text);
        bool contains = _validationErrors.ContainsKey(nameof(Text));
        if (!isValid && !contains)
            _validationErrors.Add(nameof(Text), "Mandatory field!");
        else if (isValid && contains)
            _validationErrors.Remove(nameof(Text));

        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(nameof(Text)));
    }

    public bool HasErrors => _validationErrors.Count > 0;

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public IEnumerable GetErrors(string propertyName)
    {
        string message;
        if (_validationErrors.TryGetValue(propertyName, out message))
            return new List<string> { message };

        return null;
    }

    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            _text = value; 
        }
    }
}

XAML:

<Window x:Class="WpfApp2.Window3"
        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"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="Window3" Height="300" Width="300">
    <Window.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="25" Text="*" DockPanel.Dock="Right" />
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="26" Margin="62,213,0,0" VerticalAlignment="Top" Width="121" Click="Button_Click_1"/>
        <TextBox x:Name="txtEmail1" Text="{Binding Text}" Height="61" Margin="116,10,194,0" Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
    </Grid>
</Window>

And please refer to the following blog post for more information about how data validation in WPF works.

Data validation in WPF: https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/

Share:
16,934
kAsdh
Author by

kAsdh

I'm an Enthusiastic IT professional,always seeking to explore more knowledge from working in various technologies

Updated on June 04, 2022

Comments

  • kAsdh
    kAsdh almost 2 years

    I need a simple way to validate of text boxes (Required Field). It should check all mandatory field existence , when user press button.

    I have tried this code :

    <Window.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="25" Text="*" DockPanel.Dock="Right" />
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="26" Margin="62,213,0,0" VerticalAlignment="Top" Width="121" Click="Button_Click_1"/>
        <TextBox x:Name="txtEmail1" Text="" Height="61" Margin="116,10,194,0" Validation.ErrorTemplate="{StaticResource validationTemplate}"/>
    </Grid>
    

    please anyone suggest a way to make validation in Text boxes in WPF. Thank you