Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

BindingList и привязка данных

У меня есть лист в который я могу добавить\удалить какой-то объект , как сделать чтобы на это событие сразу отреагировал ListBox?


Ответ

Надо привязать ListBox к коллекции
// #r "System.Windows.Forms" using System.Windows.Forms; using System.ComponentModel;
var bl = new BindingList() { 1, 2, 3 }; new Timer { Enabled=true, Interval=1000 } // для примера каждую секунду .Tick += (s, e) => bl.AddNew(); // добавляем новые элементы в bl var f = new Form(); var lb = new ListBox() { Parent = f, Dock = DockStyle.Fill, DataSource = bl // привязка ListBox к BindingList }; f.ShowDialog();

Если надо в ListBox выводить значение свойства, то в lb надо добавить ValueMember
var lb = new ListBox() { DataSource = bl, ValueMember = "тут имя свойства"; };

Если в ListBox надо выводить изменения свойств объектов, то в объектах надо реализовать интерфейс INotifyPropertyChanged
public class Data : INotifyPropertyChanged { // требуется для уведомления о изменении значения свойств. public event PropertyChangedEventHandler PropertyChanged = delegate {}; public int Id { get; internal set; } public long Value { get { return _Value; } internal set { if (_Value != value) { _Value = value; PropertyChanged(this, new PropertyChangedEventArgs("Value")); }}} long _Value = 0; }
Работающий пример на c# тут

UPDATE
в лист добавляю число 1, а в лист бокс должна вывестись не единица, а "Число 1"
Проще всего сделать так
class Data { public int Value { get; set; } public string Text { get { return "Число " + this.Value; } } } var bl = new BindingList() { new Data { Value = 1 } }; var lb = new ListBox() { Parent = f, DataSource = bl, ValueMember="Value", DisplayMember="Text" };

Комментариев нет:

Отправить комментарий