Вопрос

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

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"));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top