简体   繁体   English

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

[英]How to bind a list count to a label in WinForms?

How can I bind the count of a list to a label. 如何将列表的计数绑定到标签。 The following code does't get updated with the list is changed: 更改列表后,以下代码无法更新:

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

Bindings listen to the PropertyChanged event of the IPropertyChanged interface. 绑定侦听IPropertyChanged接口的PropertyChanged事件。 I don't think that List.Count is reported as a PropertyChanged event when it is changed. 我不认为List.Count在更改时被报告为PropertyChanged事件。

What you could do is to implement your custom List or to find a collection that notifies when the Count is changed. 您可以做的是实现自定义列表或查找通知何时更改计数的集合。

According to Marc Gravell for this problem, he has suggested to create a facade that wraps the collection you want to bind to label1.Text 根据Marc Gravell的这个问题,他建议创建一个外观来包装你要绑定到label1.Text的集合

I have tried to implement one (for fun) and was able to get binding to Count working. 我试图实现一个(为了好玩)并且能够绑定到Count工作。
CountList<T> is a facade that wraps a collection to bind to. CountList<T>是一个包装要绑定到的集合的外观。

Here is the full of the demo. 这是完整的演示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace TextBindingTest
{
    public partial class Form1 : Form
    {
        private readonly CountList<string> _List =
            new CountList<string>(new List<string> { "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<T> : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
        private void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            var handler = PropertyChanged;
            handler(this, e);
        }

        private ICollection<T> List { get; set; }
        public int Count { get { return List.Count; } }

        public CountList(ICollection<T> list)
        {
            List = list;
        }

        public void Add(T item)
        {
            List.Add(item);
            OnPropertyChanged(new PropertyChangedEventArgs("Count"));
        }
    }
}

You can use DataSourceChanged if you have a datasource for the listbox. 如果您有列表框的数据源,则可以使用DataSourceChanged。 Just remember to update and rebind the datasource. 只需记住更新并重新绑定数据源。

This may be a bit ghetto but here is the example I worked with: 这可能有点贫民窟,但这是我合作的例子:

List<int> collection = new List<int>();
    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();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM