Я особо подчеркнул эту проблему.
Короткий ответ: да, промежуточный элемент.
Хитрость заключается в том, чтобы НЕ писать ЛЮБОЙ код для каждого элемента управления. Вы должны иметь возможность размещать на экране элемент управления графическим интерфейсом (который может или не может принимать код), а затем привязать к нему свою бизнес-логику с помощью универсального механизма привязки.
Я определил привязок через XML, через файлы свойств, а через постоянные массивы - есть миллион способов ...
Вы, вероятно, придется написать код для каждого типа объекта, связанного (а ListBox связывается по-разному чем текстовое управление), и вам, возможно, придется писать валидаторы (но указание параметров на валидаторы и управление верификаторами также должно выполняться в данных)
Теперь все, что было сказано, я был бы очень удивлен, если некоторый механизм автоматической привязки, основанный на данных, еще не существовал, Microsoft вступила в это, поскольку VB впервые вышел (хотя их реализации были довольно негибкими, я уверен, что они делают ставку r job now).
Я очень настойчив в отношении 0 строк кода на элемент управления, потому что моя работа обычно связана с настройкой сложных устройств с десятками страниц элементов управления. Типичная система клиент/сервер будет иметь 7 (!) Строк кода PER CONTROL только для передачи данных из БД, сервера, клиенту, на экран и обратно (это минимум для простого оле «немого» кода без умных трюков привязки).
0LOC/control не может быть требованием для всех, но это хорошая цель.
Комментарий к отзыву: Я сделал большую часть своих вещей вручную на Java, поэтому не уверен, что могу быть слишком полезен для конкретной работы.
Поиск по C# и привязке дал мне this, который выглядит многообещающим, хотя он может быть привязан прямо к базе данных, которая слишком много ИМО, она должна привязываться к бизнес-объекту, но концепции должны быть одинаковыми.
Один из способов создания привязок сначала должен вручную создать экземпляр связывания объектов ... (Пожалуйста, простите мой Java)
TextControl textCtrl1=new TextControl("Name Goes Here");
new TextBinder(textCtrl1, personObject, nameField);
В Java, что вторая линия становится сложнее. Когда вы привязываетесь к определенному полю, вы должны использовать отражение, чтобы найти сеттер и getter для этого поля объекта personObject. В C# я думаю, что это должно быть проще.
В любом случае, связующее должно добавить себя как слушателя к элементу управления и объекту, а затем переместить изменения взад и вперед.
Это помогает?
Редактировать2: Как вы заметили, твердая часть замечает, когда ваша недвижимость обновляется. К счастью, это необязательно. Чаще всего вам не нужно обновлять компонент после установки объекта (мне приходилось иметь дело с этим несколько раз, когда я распределял пользовательские интерфейсы, которые могли обновлять друг друга).
Таким образом, если предположить, что ваш объект не изменится, то «Binding» должен сделать следующее:
- получить значение из свойства и установить его в компоненте.
- добавить себя как слушателя к компоненту.
- Сохраните свойство/объект (если вы можете манипулировать свойствами, вы здесь заданы. Если нет, вам нужно сохранить имя объекта и свойства и использовать отражение)
- поручительство и ждать «обновленного» события от вашего компонента.
Когда вы получаете обновление от вашего компонента: - сохраните это значение в собственности. - Возможно, вы захотите установить флаг «Обновлен» или сохранить оригинал, чтобы, если вы перебираете все компоненты привязки, вы можете определить, нужно ли сохранять или обновлять какие-либо обновления.
Ваш объект всегда должен быть в курсе последних событий.
Как создать форму, вы можете поместить все обязательные элементы управления в коллекцию, так что вы можете сделать несколько других операции ...
- операции по «Сохранить» можно назвать каждый связывающий контроль и скажите ему скопировать из элемента управления в свойство, таким образом, вам не нужно использовать прослушиватель.
- Операция «Сброс» может сбросить все элементы управления до их первоначального значения.
- Операция «Тест» может запросить каждый элемент управления, если он был обновлен. . и т. д.
Эта аккуратная вещь о том, что это так, заключается в том, что каждая «операция», которую вы хотите добавить, довольно тривиально добавлять, но автоматически влияет на весь пользовательский интерфейс.
Возможно, вы также захотите создать иерархию элементов управления с абстрактным базовым классом «связывать», а затем конкретное связующее для каждого типа управления (текстовое поле, числовое поле, дата, счетчик, таблица, раскрывающееся окно) - I подумайте, что об этом.
Это может быть очень просто, но быстро набирает сложность. Попробуйте с текстовым полем и посмотрите, что вы можете сделать. Простой текстовый объект привязки должен быть как 5 строк кода, если вы можете передать «свойства» вокруг в C# ...
Спасибо, Билл! Можете ли вы указать мне куда-нибудь, я могу увидеть некоторые примеры? – GernBlandston
Итак, TextControl представляет текстовое поле, а TextBinder представляет объект, который содержит единственную связь между объектом управления и бизнес-объектом? Я думаю, что мне нужно сделать некоторые чтения в «добавлении себя в качестве слушателя для элемента управления и объекта». – GernBlandston
Правильно. Легко добавить себя к элементу управления в качестве слушателя. Довольно легко записать изменения из элемента управления в свойство. Трудно слушать свойство для обновлений, если у C# нет встроенной поддержки. Я должен был быть с этим сложным. Хм, может понадобиться другое редактирование для объяснения. –