Как я могу сделать привязку данных в C #? - PullRequest
35 голосов
/ 22 сентября 2008

У меня есть следующий класс

public class Car
{
   public Name {get; set;}
}

и я хочу привязать это программно к текстовому полю.

Как мне это сделать?

Съемка в темноте:

...
Car car = new Car();
TextEdit editBox = new TextEdit();
editBox.DataBinding.Add("Name", car, "Car - Name");
...

Я получаю следующую ошибку

"Невозможно привязать имя свойства к целевому элементу управления.

Что я делаю не так и как я должен это делать? Я нахожу концепцию привязки данных немного трудной для понимания из-за веб-разработки.

Ответы [ 10 ]

51 голосов
/ 22 сентября 2008

Вы хотите

editBox.DataBindings.Add("Text", car, "Name");

Первый параметр - это имя свойства элемента управления, для которого вы хотите привязать данные, второй - источник данных, третий параметр - это свойство источника данных, к которому вы хотите привязать.

11 голосов
/ 22 сентября 2008

Не глядя на синтаксис, я почти уверен, что это:

editBox.DataBinding.Add("Text", car, "Name");
7 голосов
/ 22 сентября 2008
editBox.DataBinding.Add("Text", car, "Name");

Первый аргумент - это имя свойства элемента управления, второй - объект для привязки, а последний - имя свойства объекта, которое вы хотите использовать в качестве источника данных.

6 голосов
/ 22 сентября 2008

Вы достаточно близко, строка привязки данных будет

editBox.DataBinding.Add("Text", car, "Name");

Этот первый параметр является свойством вашего объекта editbox, который будет привязан к данным. Второй параметр - это источник данных, к которому вы привязываетесь, а последний параметр - это свойство источника данных, к которому вы хотите привязать.

Имейте в виду, что привязка данных является одним из способов, поэтому если вы измените поле редактирования, объект автомобиля будет обновлен, но если вы измените имя автомобиля напрямую, поле редактирования не обновится.

3 голосов
/ 22 сентября 2008

Я верю, что

editBox.DataBindings.Add (новая привязка («Текст», машина, «Имя»));

должен добиться цели. Не пробовал, но я думаю, что это идея.

3 голосов
/ 22 сентября 2008

Попробуйте:

editBox.DataBinding.Add( "Text", car", "Name" );
1 голос
/ 22 сентября 2008

Вы пытаетесь привязаться к «имени» элемента управления TextEdit. Имя используется для программного доступа к элементу управления и не может быть связано с ним. Вы должны быть привязаны к тексту элемента управления.

0 голосов
/ 12 сентября 2017

это

 this.editBox.DataBindings.Add(new Binding("Text", car, "Name"));
0 голосов
/ 08 июля 2017

Использование синтаксиса C # 4.6:

editBox.DataBinding.Add(nameof(editBox.Text), car, nameof(car.Name));

если автомобиль равен нулю, то приведенный выше код завершится неудачей более заметным образом, чем использование литеральной строки для представления datamember из car

0 голосов
/ 03 октября 2016

Ниже приведен универсальный класс, который может использоваться как свойство и реализует INotifyPropertyChanged, используемый привязанными элементами управления для захвата изменений в значении свойства.

public class NotifyValue<datatype> : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    datatype _value;
    public datatype Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value = value;
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Value"));
        }
    }

}

Это можно объявить так:

public NotifyValue<int> myInteger = new NotifyValue<int>();

и присваивается текстовому полю, как это

Textbox1.DataBindings.Add(
    "Text", 
    this, 
    "myInteger.Value", 
    false, 
    DataSourceUpdateMode.OnPropertyChanged
);

.. где «Текст» - это свойство текстового поля, «это» - текущий экземпляр формы.

Класс не должен наследовать класс INotifyPropertyChanged. Как только вы объявляете событие типа System.ComponentModel.PropertyChangedEventHandler, событие изменения класса будет подписано блоком данных элементов управления

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