2009-03-12 5 views

Répondre

1

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

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

+0

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

+0

Sons à propos de droite ;-p –

1

Manchettes écouter l'événement PropertyChanged de l'interface IPropertyChanged. Je ne pense pas que List.Count est signalé en tant qu'événement PropertyChanged lorsqu 'il est modifié.

Ce que vous pouvez faire est de mettre en œuvre votre liste personnalisée ou de trouver une collection qui informe lorsque le nombre est modifié.

+0

Je pense que la classe BindingList déclenchera des événements lorsqu'elle changera, ce qui pourrait fonctionner mieux. – Andy

0

Vous pouvez utiliser DataSourceChanged si vous avez une source de données pour la zone de liste. N'oubliez pas de mettre à jour et de relier la source de données.

Cela peut être un ghetto peu, mais voici l'exemple que je travaillais avec:

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(); 
    } 
Questions connexes