Как привязать количество списков к метке в WinForms? - PullRequest
5 голосов
/ 12 марта 2009

Как я могу привязать счетчик списка к метке. Следующий код не обновляется, список изменен:

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

Ответы [ 3 ]

1 голос
/ 13 марта 2009

По словам Марка Гравелла для этой проблемы, он предложил создать фасад , который обертывает коллекцию, которую вы хотите связать с label1.Text

Я попытался реализовать один (для забавы) и смог получить привязку к Count работает.
<code>CountList<T> - это фасад, который оборачивает коллекцию для привязки.

Вот полное демо.

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"));
        }
    }
}
1 голос
/ 12 марта 2009

Привязки слушают событие PropertyChanged интерфейса IPropertyChanged. Я не думаю, что List.Count сообщается как событие PropertyChanged при его изменении.

Что вы можете сделать, это реализовать свой собственный список или найти коллекцию, которая уведомляет об изменении количества.

0 голосов
/ 12 марта 2009

Вы можете использовать DataSourceChanged, если у вас есть источник данных для списка. Просто не забудьте обновить и заново связать источник данных.

Это может быть немного гетто, но вот пример, с которым я работал:

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...