WPF’de Data Annotations ile Veri Doğrulaması

Ekrandan veri girişi yapılan uygulamalarda verilerin doğrulanması kaçınılmazdır. WPF üzerinde bu işi kolay bir yoldan halletmek için .NET’teki “System.ComponentModel.DataAnnotations” kütüphanesini kullanacağız. Öncelikle ekrana alanları ve gönder tuşunu ekliyoruz. Ekranın arka tarafında “Datacontext”‘i ayarlayarak ekranı daha önce oluşturduğumuz modele bağlıyoruz. Ekrandaki alanları da “Binding” yardımı ile modeldeki “Property”‘lere bağlıyoruz. Alanların kısıtlarını “Property”‘lerin üzerinde tanımladığımız “Data Annotations” ile belirliyoruz. “Submit” tuşuna basıldığında ise yazdığımız kodla doğrulama gerçekleşiyor ve mesaj kutusunda gösteriliyor.

MainWindow.xaml

<Window x:Class="WpfValidation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="150"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        
        <TextBlock Text="Name:" Grid.Column="0" Grid.Row="0"/>
        <TextBox Text="{Binding Name}" Grid.Column="1" Grid.Row="0"/>

        <TextBlock Text="Age:" Grid.Column="0" Grid.Row="1"/>
        <TextBox Text="{Binding Age}" Grid.Column="1" Grid.Row="1"/>
        
        <TextBlock Text="Birth Date:" Grid.Column="0" Grid.Row="2"/>
        <TextBox Text="{Binding BirthDate}" Grid.Column="1" Grid.Row="2"/>

        <TextBlock Text="TCKN:" Grid.Column="0" Grid.Row="3"/>
        <TextBox Text="{Binding Tckn}" Grid.Column="1" Grid.Row="3"/>
        
        <Button Content="Submit" Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="2" Click="Button_Click"/>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Windows;
using WpfValidation.ViewModels;

namespace WpfValidation
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new MainWindowViewModel();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var validationResults = new List<ValidationResult>();

            bool isValid = Validator.TryValidateObject(DataContext,
                                                       new ValidationContext(DataContext), 
                                                       validationResults, 
                                                       true);

            if (isValid)
            {
                MessageBox.Show("Validation success.");
            }
            else
            {
                var strErr = String.Empty;

                foreach (var item in validationResults)
                {
                    strErr += item.ErrorMessage + "\n";
                }

                MessageBox.Show(strErr);
            }
        }
    }
}

MainWindowViewModel.cs

using System;
using System.ComponentModel.DataAnnotations;

namespace WpfValidation.ViewModels
{
    public class MainWindowViewModel
    {
        public MainWindowViewModel()
        {
            // Default values
            Name = "Test";
            Age = 67;
            BirthDate = new DateTime(1980, 02, 10);
            Tckn = "11009797396";
        }

        [Required(ErrorMessage = "Name is required.")]
        [StringLength(10, MinimumLength = 3, ErrorMessage = "The name must be between 3 and 10 characters long.")]
        [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "The name must only contain letters (a-z, A-Z).")]
        public string Name { get; set; }

        public int Age { get; set; }

        public DateTime BirthDate { get; set; }

        [Required(ErrorMessage = "Tckn is required.")]
        [StringLength(11, MinimumLength = 11, ErrorMessage = "The tckn must be 11 characters long.")]
        public string Tckn { get; set; }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *