C#IDataErrorInfo和儿童财产

C#IDataErrorInfo和儿童财产,c#,data-binding,forms,idataerrorinfo,C#,Data Binding,Forms,Idataerrorinfo,我有一个绑定到winform的对象,该对象实现IDataErrorInfo。我有一个错误提供程序。问题是当属性的属性发生更改时 我更改年龄时没有问题(即检查并正确显示/删除规则)。但是,当我更改职务时,不会显示/删除错误(事实上,属性职务不属于对象人员)。我如何进行检查 this.errorProvider1.DataSource = this.bindingSourcePerson; bindingSourcePerson.DataSource = new Person(); textBoxA

我有一个绑定到winform的对象,该对象实现IDataErrorInfo。我有一个错误提供程序。问题是当属性的属性发生更改时

我更改年龄时没有问题(即检查并正确显示/删除规则)。但是,当我更改职务时,不会显示/删除错误(事实上,属性职务不属于对象人员)。我如何进行检查

this.errorProvider1.DataSource = this.bindingSourcePerson;
bindingSourcePerson.DataSource = new Person();
textBoxAge.DataBindings.Add("Text", bindingSourcePerson, "Age");
textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJob.Title");

public class Person : IDataErrorInfo
{
    public double Age { get; set; }
    private Job _job = new Job();
    public Job CurrentJob { get { return _job; } set { _job = value; } }

    public string this[string columnName]
    {
        get
        {
            _lastError = "";
            switch (columnName)
            {
                case "Age":
                case "CurrentJob.Title":
                    if (!string.IsNullOrEmpty(CurrentJob.Title) && Age < 16)
                        _lastError = "Invalid job.";
                    break;

                default: _lastError = "";
                    break;

            }
            return _lastError;

        }
    }

    private string _lastError = "";
    public string Error
    {
        get { return _lastError; }
    }

    public class Job
    {
        public string Title { get; set; }
    }
this.errorProvider1.DataSource=this.bindingSourcePerson;
bindingSourcePerson.DataSource=new Person();
textBoxAge.DataBindings.Add(“Text”,bindingSourcePerson,“Age”);
textBoxJobTitle.DataBindings.Add(“Text”,bindingSourcePerson,“CurrentJob.Title”);
公共类人士:IDataErrorInfo
{
公共双年龄{get;set;}
私人作业_Job=新作业();
公共作业CurrentJob{get{return}u Job;}set{{u Job=value;}}
公共字符串此[string columnName]
{
得到
{
_lastError=“”;
开关(列名称)
{
案例“年龄”:
案例“CurrentJob.Title”:
如果(!string.IsNullOrEmpty(CurrentJob.Title)&&Age<16)
_lastError=“无效作业。”;
打破
默认值:_lastError=“”;
打破
}
返回_lastError;
}
}
私有字符串_lastError=“”;
公共字符串错误
{
获取{return\u lastError;}
}
公开课工作
{
公共字符串标题{get;set;}
}

如果您将属性添加到您的
Person
类:

public String CurrentJobTitle { get { return _job.Title; } }
然后将
文本框JobTitle
绑定到
当前JobTitle

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJobTitle");
或者,将
文本框JobTitle
绑定到
bindingSourcePerson.CurrentJob
如下:

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson.CurrentJob, "Title");

它会工作吗?

如果您将属性添加到您的
Person
类:

public String CurrentJobTitle { get { return _job.Title; } }
然后将
文本框JobTitle
绑定到
当前JobTitle

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJobTitle");
或者,将
文本框JobTitle
绑定到
bindingSourcePerson.CurrentJob
如下:

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson.CurrentJob, "Title");

它会工作吗?

如果这是WPF,我会说将文本框的datacontext设置为CurrentJob并进行验证…不过,我也想知道这一个。如果这是WPF,我会说将文本框的datacontext设置为CurrentJob并进行验证…不过,我也想知道这一个。这肯定会工作的。但我并不喜欢它,主对象有30-40个“子成员”。如果要手动将每个子成员绑定到文本框,则必须为每个子成员至少编写一行(硬)代码。即使使用反射,也必须在某个地方编写“绑定”在一个文本框和一个属性之间。所以我认为目标是精确地达到一行代码(不是因为行数重要,而是因为它是硬编码的,在那之后修改很无聊)。对于每个-submember-你可以做:textBoxSubMember.DataBindings.Add(“Text”,mainObject.submember,“SubmemberProperty”);非常确定会起作用。但我不太喜欢,主对象有30-40个“子成员”。如果要手动将每个子成员绑定到文本框,则必须为每个子成员至少编写一行(硬)代码。即使使用反射,也必须在某个地方编写“绑定”在一个文本框和一个属性之间。所以我认为目标是精确地达到一行代码(不是因为行数重要,而是因为它是硬编码的,在那之后修改很无聊)。对于你的-submember-你可以做:textBoxSubMember.DataBindings.Add(“Text”,mainObject.submember,“SubmemberProperty”);