Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
329 views
in Technique[技术] by (71.8m points)

c# - 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, "");
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

I have tried to implement one (for fun) and was able to get binding to Count working.
CountList<T> is a facade that wraps a collection to bind to.

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"));
        }
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...