Selon Marc Gravell pour ce problème, il a suggested to create a facade qui enveloppe la collection que vous voulez lier à Label1.Text
J'ai essayé d'en implanter un (pour le fun) et j'ai pu me lier à Nombre de travail.
CountList<T>
est une façade qui enveloppe une collection à lier.
Voici le plein de la démo.
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"));
}
}
}
Je pense que cela fait le travail, mais le garçon est-il compliqué! Vous penseriez qu'il devrait y avoir des moyens plus simples de faire des liaisons simples comme celle-ci. Il me semble que toutes les fonctionnalités de liaison de données dans Winforms sont destinées aux listes et aux grilles. – Khash
Oui, cela semble plus compliqué que nécessaire. J'ai commencé à regarder dans WPF ces derniers temps, et ce genre de problème de liaison ennuyeux semble résolu dans XAML – Sung
Sons à propos de droite ;-p –