2009-03-12 17 views
2

私は、オブジェクトのコレクションにデータバインドされたリストボックスを持っています。 私は、これらのオブジェクトのどれが私のプログラムのSTARTオブジェクトであるかをユーザに示すためにアイテムがどのように表示されるかを変更したい。リストボックス項目をINotifyPropertyChangedで更新する方法

私はこれを次のようにしましたが、リストボックスは自動的に更新されません。 コントロールの無効化も機能しませんでした。

私が見つけることができる唯一の方法は、データバインディングを完全に削除してもう一度追加することです。私の場合はそれは望ましくない。

別の方法がありますか?

class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      if (PersonManager.Instance.StartPerson == this) 
       return _name + " (Start)";      
      return _name; 
     } 
     set 
     { 
      _name = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

これはクラスウィッヒは、私はそのかなり確信しているリストとスタート、私は次のコード

private void button1_Click(object sender, EventArgs e) 
    { 
     PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem; 
    } 

答えて

2

を使用する形で

class PersonManager 
{ 
    public BindingList<Person> persons { get; set; } 
    public Person StartPerson { get; set; } 

    private static PersonManager _instance; 
    public static PersonManager Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new PersonManager(); 
      } 
      return _instance; 
     } 
    } 

    private PersonManager() 
    { 
     persons = new BindingList<Person>(); 
    } 
} 

あるアイテムを管理しています問題は、これを行うと、Person.Nameプロパティを「取得」アクセサーにして値を変更することです(UIの限り、アクセサーの設定と同じように動作します)。

しかし、これが起こっていると言ってバインディングを更新するものはありません。 startを設定したときにPropertyChangedが呼び出された場合、これが更新されると思います。

それは不格好だが、あなたはそれが書かれている方法は、私はあなたがこれを追加し、それを動作させる可能性が信じている(注:私はこれをテストしていないので、それは~~が問題を有していてもよい):

private void button1_Click(object sender, EventArgs e) 
{ 
    Person newStart = (Person)listBox1.SelectedItem; 
    if (newStart != null) 
    { 
     PersonManager.Instance.StartPerson = newStart; 
     newStart.Name = newStart.Name; // Dumb, but forces a PropertyChanged event so the binding updates 
    } 
} 
+0

魅力のように機能した、スピーディーな対応に感謝します! –

+0

ちょうど好奇心を抱いていますが、このようなコードを最初から作成した場合、どうすればこの問題を解決できますか? –

+0

潜在的によりクリーンな方法は、Name + DisplayNameプロパティのようなものを持つことです。また、「開始」の人物かどうかを判断するプロパティがある場合は、イベントを発生させるように設定します。多くのオプションがあります。実際にどのように使用されるかによって異なります。 –

関連する問題