2009-03-12 8 views

Antwort

1

Laut Marc GRA für dieses Problem, hat er suggested to create a facade, die die Sammlung, die Sie

zu label1.Text binden möchten hüllt

Ich habe versucht, eine zu implementieren (zum Spaß) und war in der Lage, verbindlich zu Count arbeiten.
CountList<T> ist eine Fassade, die eine Sammlung zum Binden umschließt.

Hier ist das volle 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")); 
     } 
    } 
} 
+0

Ich denke, das macht den Job, aber Junge ist es kompliziert! Man sollte meinen, es sollte einfachere Möglichkeiten geben, einfache Bindungen wie diese zu machen. Scheint mir, alle Datenbindungsfunktionalität in Winforms ist für Listen und Raster ausgerichtet. – Khash

+0

Ja, es sieht komplizierter aus als es sein muss. Ich habe in letzter Zeit begonnen, in WPF zu suchen, und diese Art von lästigen Binding-Problem scheint in XAML – Sung

+0

Sounds über rechts; -p gelöst –

1

Bindungen hören das Property Ereignis der IPropertyChanged Schnittstelle. Ich glaube nicht, dass List.Count als PropertyChanged-Ereignis gemeldet wird, wenn es geändert wird.

Sie könnten Ihre benutzerdefinierte Liste implementieren oder eine Sammlung suchen, die benachrichtigt, wenn der Count geändert wird.

+0

Ich denke, dass die BindingList-Klasse Ereignisse auslösen wird, wenn es sich ändert, so dass es besser funktionieren könnte. – Andy

0

Sie können DataSourceChanged verwenden, wenn Sie eine Datenquelle für die Listbox haben. Denken Sie daran, die Datenquelle zu aktualisieren und erneut zu binden.

Dies ist ein bisschen Ghetto sein kann, aber hier ist das Beispiel, mit denen ich gearbeitet:

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(); 
    } 
Verwandte Themen