Как заставить бизнес-объекты и элементы управления пользовательским интерфейсом общаться друг с другом - PullRequest
1 голос
/ 27 февраля 2009

У меня есть объект person со свойством name и age, который реализует INotifyPropertyChanged. Я хочу подключить этот объект к форме ASP.NET, чтобы свойства name и age связывались с текстовыми полями таким образом, чтобы при изменении в одном месте (в элементе управления или в объекте) другой получить обновление.

Создаю ли я промежуточный класс, который прослушивает каждое событие изменения текстового поля, а объекты изменяют события и обрабатывают обновления между ними? Какой лучший способ сделать это?

Мне неясно, как заставить бизнес-объекты и пользовательский интерфейс общаться друг с другом.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2009

Я много раз подчеркивал эту проблему.

Короткий ответ - да, промежуточный пункт.

Хитрость в том, чтобы НЕ писать ЛЮБОЙ код на элемент управления. Вы должны иметь возможность разместить на экране элемент управления с графическим интерфейсом (который может или не может принимать код), а затем привязать к нему свою бизнес-логику с помощью универсального механизма привязки.

Я определил привязки через XML, через файлы свойств и через постоянные массивы - существует миллион способов ...

Вы, вероятно, должны писать код для ТИПА привязанного объекта (список связывается не так, как текстовый элемент управления), и вам, возможно, придется писать валидаторы (но указание параметров для валидаторов и того, с каким элементом управления связываются валидаторы, также должно быть выполнено). в данных)

Теперь, несмотря на все сказанное, я был бы очень удивлен, если бы не существовал какой-либо механизм автоматической привязки, управляемый данными, Microsoft занялась этим с момента появления VB (хотя их реализации раньше были довольно негибкими, я я уверен, что теперь они работают лучше).

Я очень настаиваю на 0 строках кода на элемент управления, потому что моя работа обычно заключалась в настройке сложных устройств с десятками страниц элементов управления. Типичная система клиент / сервер будет иметь 7 (!) Строк кода PER CONTROL только для передачи данных из БД, на сервер, к клиенту, на экран и обратно (это минимум для простого «тупого» кода) без хитрых переплетов).

0LOC / контроль не может быть требованием для всех, но это хорошая цель.

Комментарий комментария: Я выполнил большую часть своих работ вручную на Java, поэтому не уверен, что смогу слишком сильно помочь со спецификой.

Поиск C # и связывание дали мне this , который выглядит многообещающе, хотя он может быть привязан напрямую к базе данных, которая является слишком много IMO, он должен связываться с бизнес-объектом, но концепции должны быть то же самое.

Один из способов сначала создать привязки - это вручную создать объекты привязки ... (прошу прощения за мой Java)

TextControl textCtrl1=new TextControl("Name Goes Here");
new TextBinder(textCtrl1, personObject, nameField);

В Java эта вторая строка становится хитрой. Когда вы привязываете к определенному полю, вы ДОЛЖНЫ использовать отражение, чтобы найти установщик и получатель для этого поля personObject. В C # я думаю, что это должно быть проще.

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

Помогает ли это кому-нибудь?

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

Итак, если вы предполагаете, что ваш объект не изменится, «Привязка» должна сделать следующее:

  • получить значение из свойства и установить его в компоненте.
  • добавить себя в качестве слушателя компонента.
  • сохранить свойство / объект (если вы можете манипулировать свойствами, вы здесь настроены. Если нет, вам нужно сохранить имя объекта и свойства и использовать отражение)
  • залог и ожидание "обновленного" события от вашего компонента.

Когда вы получаете обновление от вашего компонента: - сохранить значение в собственности. - Возможно, вы захотите установить флаг «Обновлен» или сохранить оригинал, чтобы, если вы перебираете все связывающие компоненты, вы могли сказать, нужно ли сохранять какие-либо обновления / включить кнопку «ОК».

Ваш объект всегда должен быть очень современным.

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

  • Операция «Сохранить» может вызывать каждый элемент управления привязкой и указывать ему копировать из элемента управления в свойство, таким образом вам не нужно использовать прослушиватель.
  • Операция «Сброс» может сбросить все элементы управления до их первоначального значения.
  • Операция «Тест» может запрашивать каждый элемент управления, был ли он обновлен. , и т.д.

Отличная особенность такого подхода заключается в том, что каждая «операция», которую вы хотите добавить, довольно проста для добавления, но автоматически влияет на весь пользовательский интерфейс.

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

Это может быть очень просто, но быстро усложняется. Попробуйте это с текстовым полем и посмотрите, что вы можете сделать. Простой объект привязки текста должен быть похож на 5 строк кода, если вы можете передавать «свойства» в C # ...

0 голосов
/ 28 февраля 2009

Хорошо, совершенно отдельный ответ. Как я уже говорил, я не очень разбираюсь в технологиях C #, но, как я слышал, LINQ может сделать всю эту работу за вас.

Фактически, LINQ может быть сделан именно для того, что вы пытаетесь сделать. Его нет в Java, поэтому я дал вам «ручную» версию в другом ответе.

Комментарий внизу этой страницы: http://msdn.microsoft.com/en-us/library/z919e8tw.aspx указывает на лучший путь.

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