2009-03-12 23 views
2

ile güncelleştirme nasıl yapılır? Nesnelerin bir koleksiyonuna veri olan bir liste kutusu var. Öğelerin görüntülenme şeklini, bu nesnelerden birinin programımdaki START nesnesi olduğunu kullanıcıya göstermek için değiştirmek istiyorum.liste kutusu öğelerini INOTifyPropertyChanged

Bunu şu şekilde yapmayı denedim, ancak liste kutusu otomatik olarak güncelleştirilmiyor. Denetimi geçersiz kılma da işe yaramadı.

Bulabildiğim tek yol, veri kutularını tamamen kaldırmak ve tekrar eklemek. ama benim durumumda bu arzu edilmez.

Başka bir yolu var mı?

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; 
    } 
} 

Bu

sınıf wich ben eminim listesi ve aşağıdaki kodu

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

cevap

2

kullanmak formda başlat

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

olan öğeyi yönetir Sorun şu ki, bunu yaptığınızda, Person.Name özelliklerinin "get" erişimcisinin değeri değiştirmesini (ve kullanıcı arabirimi ile ilgili olarak ayarlanmış bir erişimci gibi davranmayı) sağlamanızdır. Bununla birlikte, bunun gerçekleştiğini söylemek için bağlamaları güncelleştiren hiçbir şey yoktur. Başlangıç ​​ayarladığınızda PropertyChanged çağrıldıysa, bunun güncelleneceğini düşünüyorum. (: Ben bu test etmedi, bu yüzden ~ ~ sorunları olabilir NOT):

O aksak, ama o yazılı olan yolu, bunu ekleyebilir ve o iş yapmak inanıyorum

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

Hızlı yanıt için çok teşekkürler, bu bir cazibe gibi çalıştı! –

+0

Sadece merak etmek gerekirse, bu gibi bir şeyi sıfırdan kodlamış olsaydınız, bu sorunu nasıl çözersiniz? –

+0

Potansiyel olarak daha temiz bir yol, Name + DisplayName özelliği gibi bir şeylere sahip olabilir. Alternatif olarak, bir kişinin "Başlangıç" kişisi olup olmadığını belirleyen bir mülkünüz varsa, bu durumu ayarlamak etkinliği yükseltecektir. Çok fazla seçenek var - gerçekten nasıl kullanılacağına bağlı. –