cum să actualizeze articole pe ListBox cu INotifyPropertyChanged

voturi
2

Am un listbox care este databound la o colecție de obiecte. Vreau să modifice modul în care elementele sunt afișate pentru a arăta utilizatorului care unul dintre aceste obiecte este obiectul START în programul meu.

Am încercat să fac acest lucru următorul mod, dar listbox nu se actualizează automat. Invalidarea controlul, de asemenea, nu a funcționat.

Singurul mod în care pot găsi este de a elimina complet databindings și adăugați-l înapoi din nou. dar, în cazul meu, care nu este de dorit.

Există o altă cale?

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

Aceasta este clasa Wich gestionează lista și elementul care este începutul

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

În formularul am folosi următorul cod

    private void button1_Click(object sender, EventArgs e)
    {
        PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem;
    }
Întrebat 12/03/2009 la 13:29
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
2

Sunt destul de sigur că problema este că, atunci când faci acest lucru, faci în mod eficient proprietățile Person.Name „get“ Accessor schimba valoarea (și să acționeze ca un set de Accessor în ceea ce privește interfața cu utilizatorul este în cauză).

Cu toate acestea, nu există nimic care se actualizează legăturile să spun că acest lucru se întâmplă. Dacă PropertyChanged a fost numit atunci când setați începe, cred că acest lucru ar fi actualizat.

Este greoaie, dar modul în care l-ați scris, eu cred că ai putea adăuga acest lucru și a face să funcționeze (NOTĂ: Nu am testat acest lucru, așa că poate ~ ~ avea probleme):

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
    }
}
Publicat 12/03/2009 la 13:50
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more