如何将列表计数绑定到WinForms中的标签?

如何将列表的计数绑定到标签。 更改列表后,以下代码无法更新:

private IList list = new List(); //... label1.DataBindings.Add("Text", list.Count, ""); 

根据Marc Gravell的问题,他建议创建一个外观 ,用于包装要绑定到label1.Text的集合。

我试图实现一个(为了好玩)并且能够绑定到Count工作。
CountList是一个包装要绑定到的集合的外观。

这是完整的演示。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; namespace TextBindingTest { public partial class Form1 : Form { private readonly CountList _List = new CountList(new List { "a", "b", "c" }); public Form1() { InitializeComponent(); BindAll(); } private void BindAll() { var binding = new Binding("Text", _List, "Count", true); binding.Format += (sender, e) => e.Value = string.Format("{0} items", e.Value); label1.DataBindings.Add(binding); } private void addToList_Click(object sender, EventArgs e) { _List.Add("a"); } private void closeButton_Click(object sender, EventArgs e) { Close(); } } public class CountList : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged = delegate { }; private void OnPropertyChanged(PropertyChangedEventArgs e) { var handler = PropertyChanged; handler(this, e); } private ICollection List { get; set; } public int Count { get { return List.Count; } } public CountList(ICollection list) { List = list; } public void Add(T item) { List.Add(item); OnPropertyChanged(new PropertyChangedEventArgs("Count")); } } } 

绑定侦听IPropertyChanged接口的PropertyChanged事件。 我认为List.Count在更改时不会被报告为PropertyChanged事件。

您可以做的是实现自定义列表或查找通知何时更改计数的集合。

如果您有列表框的数据源,则可以使用DataSourceChanged。 只需记住更新并重新绑定数据源。

这可能有点贫民窟,但这是我合作的例子:

 List collection = new List(); public Form1() { InitializeComponent(); listBox1.DataSourceChanged += listbox1_Changed; } private void button1_Click(object sender, EventArgs e) { collection.Add(new Random().Next(100)); listBox1.BeginUpdate(); listBox1.DataSource = null; listBox1.DataSource = collection; listBox1.EndUpdate(); } private void listbox1_Changed(object sender, EventArgs e) { textBox1.Text = collection.Count.ToString(); }