2009-03-17 20 views
12

Tengo una clase personalizada Foo con propiedades A y B. Quiero mostrarlo en un control de enlace de datos.¿Cómo puedo detectar cambios en las propiedades del elemento en BindingList <T>?

He creado una clase Foos : BindingList<Foo>.

Para actualizar algunas propiedades internas de la clase Foos necesito que se notifiquen los cambios de propiedad (puedo manejar inserciones, eliminaciones, etc.) en los elementos de la lista. ¿Cómo implementarías esa funcionalidad?

¿Debo heredar Foo de algún objeto en el marco que lo soporte? Creo que podría crear eventos que me notifiquen si hay cambios, pero ¿es así como debe hacerse? ¿O hay algún patrón en el marco que me ayudaría?

Respuesta

19

Foo debe implementar las interfaces INotifyPropertyChanged y INotifyPropertyChanging.

public void Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private int _someValue; 
    public int SomeValue 
    { 
     get { return _someValue; } 
     set { _someValue = value; NotifyPropertyChanged("SomeValue"); } 
    } 
} 

El BindingList debe engancharse en el controlador de eventos automágicamente, y su interfaz gráfica de usuario ahora debería actualizarse whever configura su clase invoca el controlador de eventos PropertyChanged.

[Editar para añadir:] Además, la clase BindingList exposted two events la que le notifique cuando la colección se ha añadido o modificado:

public void DoSomething() 
{ 
    BindingList<Foo> foos = getBindingList(); 
    foos.ListChanged += HandleFooChanged; 
} 

void HandleFooChanged(object sender, ListChangedEventArgs e) 
{ 
    MessageBox.Show(e.ListChangedType.ToString()); 
} 
+0

Probando ... creo que es lo que estoy buscando. –

+0

¿Qué evento en la clase Foos atrapará a los manejadores PropertyChanged de Fire? Recuerda que necesito algo de trabajo en la clase Foos (básicamente, reelaborar algunos diccionarios internos). –

+0

Digamos que su clase Foo se implementó de la misma manera que se muestra arriba. Cuando cualquier clase establece la propiedad Foo.SomeValue, la instancia de Foo aumenta el controlador de eventos PropertyChanged. Puede (si lo desea) enganchar en este controlador de eventos directamente en la instancia de Foo, o mediante BindingList.ListChanged. – Juliet

Cuestiones relacionadas