Aquí podría ser tu PUBLICIDAD


cómo actualizar elementos de listbox con INotifyPropertyChanged

votos
2

Tengo un listbox que está enlazado a una colección de objetos. Quiero modificar la forma en que se muestran los elementos para mostrar al usuario cuál de estos objetos es el objeto START de mi programa.

Intenté hacer esto de la siguiente manera, pero el listbox no se actualiza automáticamente. Invalidar el control tampoco funcionó.

La única forma en que puedo encontrar es eliminar por completo las conexiones de datos y volver a agregarlas. pero en mi caso eso no es deseable.

¿Hay otra manera?

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

Esta es la clase que maneja la lista y el ítem que es el comienzo

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

En la forma utilizo el siguiente código

    private void button1_Click(object sender, EventArgs e)
    {
        PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem;
    }
Publicado el 12/03/2009 a las 15:29
fuente por usuario sjors miltenburg
En otros idiomas...        العربية       

1 respuestas

votos
2

Estoy bastante seguro de que el problema es que, cuando haces esto, estás haciendo que el atributo "get" de propiedades de Person.Name efectivamente cambie o cambie el valor (y actúe como un acceso de conjunto en lo que se refiere a la UI).

Sin embargo, no hay nada que esté actualizando los enlaces para decir que esto está sucediendo. Si se llamó a PropertyChanged cuando estableces el inicio, creo que esto se actualizará.

Es torpe, pero la forma en que lo tiene escrito, creo que podría agregar esto y hacerlo funcionar (NOTA: No lo probé, por lo que ~ puede ~ tener problemas):

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
    }
}
Respondida el 12/03/2009 a las 03:50
fuente por usuario Reed Copsey


Aquí podría ser tu PUBLICIDAD