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

2

Мне еще предстоит найти "хороший" способ сделать двухстороннюю привязку данных в .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:
Обратите внимание: я хочу добавить ссылку на управление в коллекцию привязки, тогда эта коллекция будет использоваться для привязки и открепления.

  • 0
    Привязка основана на строках, потому что привязка (в большинстве случаев) использует форму отражения.
  • 0
    Да, но это моя точка зрения, я не хочу использовать отражение! :)
Показать ещё 1 комментарий
Теги:
data-binding

3 ответа

2
Лучший ответ

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

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

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

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

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

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

UPDATE:

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

0

Одним из решений было бы передать 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

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

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

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

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

По-моему, это событие DataBinding.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню