Привязка элементов управления к свойствам класса - это технически возможно? - PullRequest
2 голосов
/ 20 марта 2009

Мне еще предстоит найти «хороший» способ сделать двухстороннее связывание данных в .Net.
Одна вещь, которая мне не нравится, например, в существующем двухстороннем связывании данных asp.net - это связывание на странице aspx, это не проверка времени компиляции, то есть:

<asp:TextBox ID="TitleTextBox"
            runat="server"            Text='<%# Bind("Title_oops_spelled_wrong") %>'>

Я бы хотел что-то вроде этого:

Class Binder
Public Sub BindControl(ctl As Control, objectProperty As ???????)
  '// Add ctl and objectProperty to a collection

End Sub

Что я не знаю, так это то, как получить objectProperty в моем примере; Я хочу получить ссылку (т. Е. Указатель) на свойство, поэтому позже по этой ссылке я могу либо читать, либо записывать свойство.

Может ли это быть как-то сделано с делегатами, может быть ??

UPDATE:
Обратите внимание, я хочу добавить элемент управления reference в коллекцию привязок, эта коллекция затем будет использоваться для привязки и отмены привязки.

Ответы [ 3 ]

2 голосов
/ 25 марта 2009

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

Вы можете взаимодействовать с механизмом привязки данных двумя способами: либо программно, либо через конструктор. Выполнить привязку основных данных программно тривиально. Скажем, у меня есть класс с именем «FooClass» со строковым свойством с именем «MyString». У меня есть TextBox с именем myTxtBox в форме с экземпляром FooClass с именем foo, и я хочу связать его со свойством MyString:

myTxtBox.DataBindings.Add("Text", foo, "MyString");

Выполнение этого приведет к тому, что обновления TextBox будут присвоены свойству, а изменения свойства из другого места будут отражены в TextBox.

Для более сложных сценариев привязки данных вы, вероятно, захотите создать объектный источник данных в своем проекте и добавить в форму BindingSource. Если вам нужна помощь с конкретными шагами по созданию источника данных, я могу помочь, но в целом вы создадите источник в своем проекте и выберите класс, к которому вы хотите привязать. Затем вы можете разместить BindingSource в своей форме, указать его на источник данных вашего объектного проекта, а затем использовать конструктор Visual Studio, чтобы связать свойства ваших элементов управления со свойствами вашего объекта. Затем вы устанавливаете свойство DataSource в своем коде для экземпляра класса или коллекции, к которой хотите привязаться.

В качестве примечания, насколько мне известно, не существует "делегата свойства", поскольку свойства на самом деле являются парами функций (get_ и набор _).

UPDATE:

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

0 голосов
/ 21 марта 2009

Одним из решений было бы передать objectProperty ByRef.

Если вы хотите проверить тип времени компиляции, вам потребуется перегрузить BindControl для любых типов, которые вы планируете использовать. Например:

Public Sub BindControl(ctl As ITextControl, ByRef objectProperty As String)
    objectProperty = ITextControl.Text
End Sub

Public Sub BindControl(ctl As ITextControl, ByRef objectProperty As Integer)
    Integer.TryParse(TextControl.Text, objectProperty)
End Sub
..
0 голосов
/ 21 марта 2009

Bind - это не метод, и за сценой нет какого-либо объекта, связывающего связывание. Это просто «волшебное» слово, которое парсер страниц использует для генерации кода. По сути, это переводится в Eval и контролирует строительный кодекс. Eval, с другой стороны, будет использовать отражение для доступа к свойствам связанного элемента.

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

<asp:TextBox ID="TitleTextBox" runat="server" Text='<%# Title %>' />

Для двусторонней привязки вам нужно будет либо создать свой собственный шаблон, либо отразить существующий, передать метод ExtractTemplateValuesMethod и назначить событие DataBinding своему элементу управления. Именно здесь .NET использует Eval, который вы замените присвоением свойства.

По-моему, для этого и существует событие DataBinding.

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

Вы могли бы использовать делегатов, но это вернуло бы вас к тому же коду, который генерирует .NET, который определяет ExtractTemplateValuesMethod и в любом случае выполняет DataBinding.

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