C # IDataErrorInfo и дочернее свойство

2

У меня есть объект, связанный с winform, и этот объект реализует IDataErrorInfo. У меня есть провайдер ошибок. Проблема заключается в изменении свойства свойства a.

Нет проблем при изменении возраста (т.е. правила проверяются и отображаются/удаляются правильно). Но когда я меняю название задания, ошибка не отображается/удаляется (действительно, свойство Title не принадлежит лицу объекта). Как я могу выполнить чек?

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; }
    }
  • 0
    Если бы это был WPF, я бы сказал, установите текстовый текст в текстовом поле в CurrentJob и подтвердите это ... Я бы тоже хотел знать этот.
Теги:
forms
data-binding
idataerrorinfo

1 ответ

0

если вы добавите свойство в класс Person:

public String CurrentJobTitle { get { return _job.Title; } }

а затем привяжите TextBoxJobTitle к CurrentJobTitle:

textBoxJobTitle.DataBindings.Add("Text", bindingSourcePerson, "CurrentJobTitle");

Или привяжите TextBoxJobTitle к bindingSourcePerson.CurrentJob следующим образом:

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

будет ли он работать?

  • 0
    Уверен, сработает. Но это не очень понравилось, и главный объект получил 30-40 «субмейберов».
  • 0
    если вы собираетесь связать каждый элемент -подписчик с текстовым полем вручную, вы должны написать хотя бы 1 строку (жесткого) кода для каждого из них. Даже при использовании отражения вы должны написать где-нибудь «связывание» между текстовым полем и свойством. Поэтому я думаю, что цель состоит в том, чтобы достичь ровно одной строки кода (не то, чтобы количество строк имело значение, а потому, что оно жестко запрограммировано, после этого скучно модифицировать). Для каждого вашего -субъекта вы можете сделать: textBoxSubMember.DataBindings.Add ("Text", mainObject.Submember, "SubmemberProperty");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню