Двухстороннее связывание с особенностями пользовательского интерфейса - PullRequest
2 голосов
/ 08 сентября 2010

Раньше я не делал двухсторонний проект связывания, так что это может быть простой вопрос.

У меня есть бизнес-объект со всеми необходимыми интерфейсами (INotifyPropertyChanged и т. Д.).Я связал свойство Int32 с именем CPP с текстовым полем с именем txtCPP через BindingSource.Правила гласят, что если CPP меньше 0, текстовое поле должно быть пустым, в противном случае должно отображаться значение.

Итак, чтобы это произошло, я изменил свойство с Int32 на Int32?(обнуляемый) и когда переменная поддержки свойства CPP меньше нуля, я фактически возвращаю ноль.

Это на самом деле работает нормально с пользовательским интерфейсом.Проблема возникает, когда я хочу сохранить бизнес-объект в базе данных.Внешний метод берет бизнес-объект, считывает его свойства (включая CPP) и сохраняет их в базе данных.И очевидно, что вместо CPP, равного -1, он записывается как ноль.

Я уверен, что я не первый, кто сталкивается с этой проблемой при выполнении двусторонних проектов связывания.Как обычно справиться с этими проблемами чисто, не загрязняя код формы такими крайними случаями?

1 Ответ

3 голосов
/ 08 сентября 2010

Звучит так, как будто ваше правило о том, что поле не заполнено, является правилом пользовательского интерфейса, а не правилом данных (поэтому значение данных действительно равно -1, оно просто должно отображаться как пустое).

Если это так, давайте переместим пустую логику в пользовательский интерфейс. Итак, ваше свойство объекта данных возвращает целое число (и оно возвращает действительное значение целого), и затем вы можете изменить его на своем дисплее.

Один из способов сделать это будет с форматированием - вы можете указать Formatter с привязкой данных или перехватить событие Format на привязке данных.

Конечно, вам все еще нужно решить, что делать, когда пользователь вводит пустое значение в текстовое поле ...

Вот очень простой пример использования события Format в привязке данных:


var binding = this.textBox1.DataBindings.Add("Text", MyObject, "AValue", true);
binding.Format += (s, args) =>
    {
        int i = (int)args.Value;
        if (i <= 0)
        args.Value = "";
    };

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...