Как я могу выполнить привязку данных в С#?
-
02-07-2019 - |
Вопрос
У меня есть следующий класс
public class Car { public Name {get; set;} }
и я хочу программно привязать это к текстовому полю.
Как мне это сделать?
Стрельба в темноте:
... Car car = new Car(); TextEdit editBox = new TextEdit(); editBox.DataBinding.Add("Name", car, "Car - Name"); ...
Я получаю следующую ошибку
«Невозможно выполнить привязку к свойству «Имя» целевого элемента управления.
Что я делаю не так и как мне следует это делать?Мне кажется, что концепция привязки данных немного сложна для понимания, исходя из веб-разработки.
Решение
Вы хотите
editBox.DataBindings.Add("Text", car, "Name");
Первый параметр — это имя свойства элемента управления, к которому вы хотите привязать данные, второй — это источник данных, третий параметр — это свойство источника данных, к которому вы хотите привязаться.
Другие советы
Не глядя на синтаксис, я почти уверен, что это:
editBox.DataBinding.Add("Text", car, "Name");
editBox.DataBinding.Add("Text", car, "Name");
Первый аргумент — это имя свойства элемента управления, второй — объект для привязки и последний — имя свойства объекта, которое вы хотите использовать в качестве источника данных.
Вы очень близки к тому, чтобы строка привязки данных была
editBox.DataBinding.Add("Text", car, "Name");
Этот первый параметр является свойством вашего объекта поля редактирования, который будет привязан к данным.Второй параметр — это источник данных, к которому вы привязываетесь, а последний параметр — это свойство источника данных, к которому вы хотите привязаться.
Имейте в виду, что привязка данных является односторонней, поэтому, если вы измените поле редактирования, объект автомобиля обновится, но если вы измените название автомобиля напрямую, поле редактирования не обновится.
Пытаться:
editBox.DataBinding.Add( "Text", car", "Name" );
я полагаю, что
editBox.DataBindings.Add(new Binding("Текст", автомобиль, "Имя");
должен сделать свое дело.Не пробовал, но думаю идея в этом.
Вы пытаетесь привязаться к «Имени» элемента управления TextEdit.Имя используется для программного доступа к элементу управления и не может быть привязано.Вы должны быть привязаны к тексту элемента управления.
Ниже приведен универсальный класс, который можно использовать в качестве свойства и реализует 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, на событие изменения класса будет подписываться привязка данных элементов управления.
Использование синтаксиса C# 4.6:
editBox.DataBinding.Add(nameof(editBox.Text), car, nameof(car.Name));
если car имеет значение null, то приведенный выше код потерпит неудачу более заметно, чем использование буквальной строки для представления datamember
из car
его
this.editBox.DataBindings.Add(new Binding("Text", car, "Name"));