2009-02-27 2 views
1

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

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

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

ответ

2

Я особо подчеркнул эту проблему.

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

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

Я определил привязок через 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# ...

+0

Спасибо, Билл! Можете ли вы указать мне куда-нибудь, я могу увидеть некоторые примеры? – GernBlandston

+0

Итак, TextControl представляет текстовое поле, а TextBinder представляет объект, который содержит единственную связь между объектом управления и бизнес-объектом? Я думаю, что мне нужно сделать некоторые чтения в «добавлении себя в качестве слушателя для элемента управления и объекта». – GernBlandston

+0

Правильно. Легко добавить себя к элементу управления в качестве слушателя. Довольно легко записать изменения из элемента управления в свойство. Трудно слушать свойство для обновлений, если у C# нет встроенной поддержки. Я должен был быть с этим сложным. Хм, может понадобиться другое редактирование для объяснения. –

0

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

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

В конце этой страницы: http://msdn.microsoft.com/en-us/library/z919e8tw.aspx ссылается на лучший способ.

 Смежные вопросы

  • Нет связанных вопросов^_^