3 Stimmen

wie man Listbox-Elemente mit INotifyPropertyChanged aktualisiert

Ich habe ein Listenfeld, das mit einer Sammlung von Objekten databound ist. Ich möchte die Art und Weise ändern, wie die Elemente angezeigt werden, um dem Benutzer zu zeigen, welches dieser Objekte das START-Objekt in meinem Programm ist.

Ich habe versucht, dies auf folgende Weise zu tun, aber die Listbox wird nicht automatisch aktualisiert. Auch das Invalidieren des Steuerelements hat nicht funktioniert.

Der einzige Weg, den ich finden kann, ist, die Datenverknüpfungen vollständig zu entfernen und sie wieder hinzuzufügen, aber das ist in meinem Fall nicht wünschenswert.

Gibt es einen anderen Weg?

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

Dies ist die Klasse, die die Liste und das Element, das den Anfang darstellt, verwaltet

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

Im Formular verwende ich den folgenden Code

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

3voto

Reed Copsey Punkte 536986

Ich bin ziemlich sicher, dass das Problem ist, dass, wenn Sie dies tun, Sie effektiv machen die Person.Name Eigenschaften "get" Accessor den Wert ändern (und handeln wie ein Set Accessor so weit wie die UI betroffen ist).

Allerdings gibt es nichts, was die Bindungen aktualisiert, um zu sagen, dass dies geschieht. Wenn PropertyChanged wurde aufgerufen, wenn Sie Start festgelegt, ich glaube, dies würde aktualisieren.

Es ist klobig, aber so wie Sie es geschrieben haben, glaube ich, dass Sie dies hinzufügen könnten und es funktionieren würde (HINWEIS: Ich habe dies nicht getestet, so dass es ~vielleicht~ Probleme hat):

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X