Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF IDataErrorInfo发行_C#_Wpf_Visual Studio - Fatal编程技术网

C# WPF IDataErrorInfo发行

C# WPF IDataErrorInfo发行,c#,wpf,visual-studio,C#,Wpf,Visual Studio,我似乎找不到关于如何设置的简单解释。有人能帮忙吗 我几乎阅读了每一篇教程,但每一篇都没有完全解释,我的问题是我已经写了一些代码,但我不确定在main window.xamls.cs中写什么,以及如何让验证工作 阶级 公共类人员:IDataErrorInfo { 公共字符串Fname{get;set;} 公共字符串Lname{get;set;} 公共字符串错误 { 获取{return”“;} } 公共字符串此[string columnName] { 得到 { 字符串结果=null; 如果(col

我似乎找不到关于如何设置的简单解释。有人能帮忙吗

我几乎阅读了每一篇教程,但每一篇都没有完全解释,我的问题是我已经写了一些代码,但我不确定在
main window.xamls.cs
中写什么,以及如何让验证工作

阶级

公共类人员:IDataErrorInfo
{
公共字符串Fname{get;set;}
公共字符串Lname{get;set;}
公共字符串错误
{
获取{return”“;}
}
公共字符串此[string columnName]
{
得到
{
字符串结果=null;
如果(columnName==“Fname”)
{
if(string.IsNullOrEmpty(Fname))
{
结果=“需要名字。”;
返回结果;
}

字符串st=@“!|@| |$\$\%| \?| \>\实际上您尚未实现INotifyPropertyChanged接口,因此不会执行属性更改通知

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
}

我已经在提供的解决方案中设置了DataContext,这是这个问题的唯一解决方案。INotifyPropertyChanged接口的实现只是为了在属性值发生变化时进行细化。谢谢,它现在可以工作了!我唯一改变的是将DataContext添加到按钮中,因为我不想在属性值发生变化后立即初始化验证程序正在运行。
<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>
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
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Person();
    }
}