Мне еще предстоит найти "хороший" способ сделать двухстороннюю привязку данных в .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:
Обратите внимание: я хочу добавить ссылку на управление в коллекцию привязки, тогда эта коллекция будет использоваться для привязки и открепления.
Есть ли причина, по которой вы хотите избежать использования механизма привязки данных .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, даже на уровне управления, НЕ автоматически использует отражение. Связывание данных строится вокруг дескрипторов типов и дескрипторов свойств, как для связанного управления, так и для источника данных. Верно, что если одна или обе стороны не реализуют конкретное свойство и описание типа, тогда будет использоваться отражение, но обе стороны более чем свободны предоставить свой собственный профиль описания, который НЕ использовал бы отражение.
Одним из решений было бы передать 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
..
Привязка не является методом и не существует какого-либо объекта за привязкой привязки сцены. Это просто "волшебное" слово, которое использует парсер страницы для генерации кода. По существу, он переводится в код Eval и код управления. С другой стороны, Eval будет использовать отражение для доступа к свойствам связанных элементов.
Если я правильно понимаю, что вы хотите, привязка свойств только для чтения уже работает. Предполагая, что у вас есть свойство Title в вашем классе:
<asp:TextBox ID="TitleTextBox" runat="server" Text='<%# Title %>' />
Для двусторонней привязки вам придется либо создать свой собственный шаблон или отразить существующий, либо передать метод ExtractTemplateValuesMethod и назначить событие DataBinding для вашего контроля. Здесь .NET использует Eval, который вы замените назначением свойства.
По-моему, это событие DataBinding.
Однако, если вы задаетесь вопросом о том, можно ли иметь ссылку на свойство, я боюсь, что нет. Не существует собственности для каждого. У вас есть методы (get и set) и запись в метаданных. Вы можете сохранить ссылку на имя объекта и свойства, но тогда вам придется использовать отражение.
Вы можете использовать делегаты, но это вернет вас к тому же коду, что и .NET, который определяет метод ExtractTemplateValuesMethod и делает DataBinding в любом случае.