Привязка данных перестает работать после замены связанного списка - PullRequest
1 голос
/ 05 октября 2010

Это вопрос привязки данных в C #.

У меня есть простой класс Person:

public class Person {
    public string Name {get; set;}
    public string Level {get; set;}
}

И у меня есть класс Group, который содержит свойство Persons в виде экземпляров BindingList of Person:

public class Group {
    private BindingList<Person> persons_;
    public BindingList<Person> Persons {
            get { return persons_; }
            set { persons_ = value; }
    }
}

Наконец, я использую BindingSource для подключения экземпляра группы к DataGridView:

// Instantiate a Group instance.
Group p = new Group();
p.Persons = new BindingList<Person> {
    new Person {Name = "n1", Level = "l1"},
    new Person {Name = "n2", Level = "l2"},
    new Person {Name = "n3", Level = "l3"}
};

BindingSource bs = new BindingSource();
bs.DataSource = p;
bs.DataMember = "Persons";
DataGridView dgv = new DataGridView();
dgv.DataSource = bs;

После вышеуказанного кода DataGridView отобразит три экземпляра Person. Все отлично работает Затем у меня есть кнопка, при нажатии которой я создаю другой Person BindingList и использую его для замены p.Persons:

p.Persons = new BindingList<Person> {
    new Person {Name = "n10", Level = "l10"},
    new Person {Name = "n11", Level = "l11"},
    new Person {Name = "n12", Level = "l12"}
};

После приведенного выше кода привязка данных перестает работать. Добавление вызовов ResetBindings () из BindingSource или DataGridView не устраняет разрыв привязки данных.

Поскольку мой BindingSource связан со свойством Persons класса Group, я думаю, что изменение свойства Persons не должно нарушать привязку данных, но на самом деле это так. Но это то, что мы обычно делаем, если привязываем строковое свойство к Label или TextBox. Мы просто назначаем новый экземпляр строки свойству, и Label или TextBox будут обновляться правильно. Почему это не работает для коллекций экземпляров? Какой правильный код для достижения того же поведения? Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Ваша модель данных очень неправильная: Свойства коллекции должны быть доступны только для чтения .

Вместо этого вы должны удалить установщик Persons, затем очистить список и повторно вызывать Add.
Если вы хотите, вы можете даже создать метод расширения

public static void  ReplaceWith<T>(this IList<T> list, params T[] newItems)
1 голос
/ 05 октября 2010

Это потому, что свойство Persons не вызывает уведомления при его изменении.Класс Group должен реализовывать INotifyPropertyChanged, а установщик свойства Persons должен вызывать событие PropertyChanged.

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