newb
newb

Reputation: 39

WPF IDataErrorInfo issue

I can't seem to find simple explanation of how to set it up can some one please help out?

I've read almost every tutorial and every single one don't explain completely, my problem is that I've already written some code but I am not sure what to write in the MainWindow.xamls.cs and how to get the validation to work.

Class

public class Person : IDataErrorInfo
    {
        public string Fname { get; set; }
        public string Lname { get; set; }
        public string Error
        {
            get { return ""; }
        }

        public string this[string columnName]
        {
            get
            {
                string result = null;
                if (columnName == "Fname")
                {
                    if (string.IsNullOrEmpty(Fname))
                    {
                        result = "First name is required.";
                        return result;
                    }
                    string st = @"!|@|#|\$|%|\?|\>|\<|\*";
                    if (Regex.IsMatch(Fname, st))
                    {
                        result = "Contains invalid characters.";
                        return result;
                    }
                }
                if (columnName == "Lname")
                {
                    if (string.IsNullOrEmpty(Lname))
                    {
                        result = "Cannot be empty.";
                        return result;
                    }
                }
                return null;
            }
        }
    }

Xaml

<Window x:Class="WpfApplication2.MainWindow"
        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:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="eTemplate">
            <DockPanel LastChildFill="True">
                <TextBlock DockPanel.Dock="Right" Foreground="Blue" FontSize="13" Text="{Binding ElementName=adorned,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" >
                </TextBlock>
                <Border BorderBrush="Red" BorderThickness="2">
                    <AdornedElementPlaceholder x:Name="adorned"/>
                </Border>
            </DockPanel>
        </ControlTemplate>
    </Window.Resources>


    <Grid>
        <TextBox Height="23" Validation.ErrorTemplate="{StaticResource ResourceKey=eTemplate}" HorizontalAlignment="Left" Margin="198,71,0,0" Name="Fname" VerticalAlignment="Top" Width="120" FontSize="15">
            <TextBox.Text>
                <Binding Path="Fname" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"/>
            </TextBox.Text>
        </TextBox>
        <TextBox Height="23" Validation.ErrorTemplate="{StaticResource ResourceKey=eTemplate}" HorizontalAlignment="Left" Margin="198,130,0,0" Name="Lname" VerticalAlignment="Top" Width="120" FontSize="15">
            <TextBox.Text>
                <Binding Path="Lname" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"/>
            </TextBox.Text>
        </TextBox>
        <Label Content="FirstName" FontSize="14" Height="28" HorizontalAlignment="Left" Margin="114,71,0,0" Name="FirstName" VerticalAlignment="Top" FontFamily="Consolas" RenderTransformOrigin="0.063,0.607" Width="84"/>
        <Label Content="LastName" FontSize="14" Height="28" HorizontalAlignment="Left" Margin="114,130,0,0" Name="LastName" VerticalAlignment="Top" FontFamily="Consolas" Width="79"/>
        <Button x:Name="Add" Content="test" HorizontalAlignment="Left" Margin="198,186,0,0" VerticalAlignment="Top" Width="120"/>


    </Grid>
</Window>

What do I do next?

Upvotes: 1

Views: 77

Answers (1)

Abhishek Anand
Abhishek Anand

Reputation: 138

Actually you've not implemented INotifyPropertyChanged interface so you property change notification is not performed. I've done some changes in your Person class as below;

public class Person : IDataErrorInfo, INotifyPropertyChanged
{
    private string _fname;
    private string _lname;
    public String Fname
    {
        get { return _fname; }
        set { _fname = value; OnPropertyChanged("Fname"); }
    }

    public String Lname
    {
        get { return _lname; }
        set { _lname = value; OnPropertyChanged("Lname"); }
    }
    public string Error
    {
        get { return ""; }
    }

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "Fname")
            {
                if (string.IsNullOrEmpty(Fname))
                {
                    result = "First name is required.";
                    return result;
                }
                string st = @"!|@|#|\$|%|\?|\>|\<|\*";
                if (Regex.IsMatch(Fname, st))
                {
                    result = "Contains invalid characters.";
                    return result;
                }
            }
            if (columnName == "Lname")
            {
                if (string.IsNullOrEmpty(Lname))
                {
                    result = "Cannot be empty.";
                    return result;
                }
            }
            return null;
        }
    }

    #region INotifyPropertyChanged implementation
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(String param)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(param));
        }
    }
    #endregion
}

And in MainWindow.cs class, just set the DataContext as Person class;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Person();
    }
}

Upvotes: 1

Related Questions