2009-03-12 10 views

答えて

1

が、彼はあなたがます。Label1.Text

にバインドするコレクションをラップ suggested to create a facadeを持っています

私は1つを(楽しいために)実装しようとしましたが、番号にバインドすることができました。
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")); 
     } 
    } 
} 
+0

これは仕事だと思いますが、少年は複雑です!このような簡単なバインディングを行う簡単な方法があるはずだと思います。 Winformsのすべてのデータバインディング機能は、リストとグリッドに対応することです。 – Khash

+0

はい、必要以上に複雑に見えます。私は最近、WPFを調べ始めました。この種のバインディングの問題は、XAMLで解決されているようです。 – Sung

+0

正しいことについての音;-p –

1

バインディングはIPropertyChangedインターフェイスのPropertyChangedイベントに耳を傾けます。私は、List.Countが変更されたときPropertyChangedイベントとして報告されるとは思わない。

カスタムリストを実装するか、カウントが変更されたときに通知するコレクションを見つけることができます。

+0

BindingListクラスは、変更されたときにイベントを発生させるので、より効果的です。 – Andy

0

リストボックス用のデータソースがある場合は、DataSourceChangedを使用できます。データソースの更新と再バインドを忘れないでください。

これは、ビットゲットーかもしれませんが、ここで私が一緒に働いた例です。この問題のためのMarc Gravellによると

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(); 
    } 
関連する問題