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