Tôi muốn có thể liên kết danh sách với nguồn dữ liệu danh sách và khi danh sách được sửa đổi, giao diện người dùng của hộp danh sách sẽ tự động được cập nhật. (Winforms không ASP). Đây là một mẫu:Danh sách liên kết tới DataSource
private List<Foo> fooList = new List<Foo>();
private void Form1_Load(object sender, EventArgs e)
{
//Add first Foo in fooList
Foo foo1 = new Foo("bar1");
fooList.Add(foo1);
//Bind fooList to the listBox
listBox1.DataSource = fooList;
//I can see bar1 in the listbox as expected
}
private void button1_Click(object sender, EventArgs e)
{
//Add anthoter Foo in fooList
Foo foo2 = new Foo("bar2");
fooList.Add(foo2);
//I expect the listBox UI to be updated thanks to INotifyPropertyChanged, but it's not
}
class Foo : INotifyPropertyChanged
{
private string bar_ ;
public string Bar
{
get { return bar_; }
set
{
bar_ = value;
NotifyPropertyChanged("Bar");
}
}
public Foo(string bar)
{
this.Bar = bar;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public override string ToString()
{
return bar_;
}
}
Nếu tôi thay List<Foo> fooList = new List<Foo>();
bởi BindingList<Foo> fooList = new BindingList<Foo>();
sau đó nó hoạt động. Nhưng tôi không muốn thay đổi kiểu người ngu ngốc ban đầu. Tôi muốn một cái gì đó như thế này để làm việc: listBox1.DataSource = new BindingList<Foo>(fooList);
EDIT: Ngoài ra tôi chỉ đọc ở đây List<T> vs BindingList<T> Advantages/DisAdvantages từ Ilia Jerebtsov: "Khi bạn thiết lập DataSource của BindingSource vào một danh sách <>, nó trong nội bộ tạo ra một BindingList quấn danh sách của bạn". Tôi nghĩ rằng mẫu của tôi chỉ chứng minh rằng điều này là không đúng: Danh sách của tôi <> dường như không được bao bọc bên trong vào một BindingList <>.
Danh sách <> không tăng bất kỳ sự kiện nào cho người quan sát để biết thời điểm cập nhật. Việc người quan sát là thành phần giao diện người dùng hay danh sách khác hoạt động như một trình bao bọc không quan trọng. Tại sao sự phản đối để thay đổi thành một BindingList khi ràng buộc là những gì bạn cần làm? – JRoughan
Tôi không muốn thay đổi Danh sách thành BindingList vì nó đã được sử dụng làm Danh sách ở mọi nơi trong dự án. Tôi sẽ phải thay thế mọi phương thức chữ ký, tôi muốn tránh sửa đổi những gì đã ổn định. – Michael
Điều gì xảy ra nếu bạn thay đổi kiểu trả về thành IList? Bạn vẫn có cùng số lượng thay đổi đột phá? –
JRoughan