2010-05-18 14 views
5

Quiero tener el diccionario que sería 'Observable' para lanzar eventos cuando el elemento cambia (Eliminar o Agregar).Diccionario observable que no se comporta como se esperaba

En otra clase, he creado dicho diccionario y he configurado el enlace en ListBox.ItemsSourseProperty.
El enlace funciona bien. Puedo ver los artículos.

Pero algo está mal: el evento PropertyChanged siempre es nulo.

¿Alguien puede ayudar?

¡Gracias de antemano!

class ObservableDictionary<TKey, TValue> : 
    Dictionary<TKey, TValue>, 
    INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public new void Remove(TKey obj) 
    { 
     base.Remove(obj); 

     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Remove")); 
     } 
    } 
} 
+1

pregunta similar: http://stackoverflow.com/questions/1098663/general-observable-dictionary-class-for-databinding-wpf-c –

+4

tenga cuidado al usar la nueva palabra clave ... porque ese método solo será se llama cuando el objeto tiene un alcance y se envía a ObservableDictionary. Como la mayoría del modelo de vinculación de framework lo convertirá en IEnumerable, Add & Remove seguirá llamando a la implementación downstream en el diccionario base. En su lugar, escribiría su clase como una clase contenedora que tiene un diccionario interno para el almacenamiento y luego implementaría las interfaces IDictionary e INotifyCollectionChanged y los métodos correspondientes. –

+0

public class Foo { public void Bar() { Console.WriteLine ("Prueba 1"); }} Foo2 clase pública: Foo { pública nueva barra void() { Console.WriteLine ("Prueba 2"); } } var f = new Foo2(); f.Bar(); ((Foo) f). Bar(); Devuelve Prueba 2 Prueba 1 –

Respuesta

5

No debe llamar al PropertyChanged para un evento de cambio de colección. Debe implementar INotifyCollectionChanged.

2

¿Alguien se está suscribiendo a Propertychanged?

Para una colección observable, que se va a también quieren INotifyCollectionChanged

3

¿Usted suscribirse al evento PropertyChanged?

var dictionary = new ObservableDictionary<int, int>(); 
dictionary.PropertyChanged += 
    (sender, args) => MessageBox.Show(args.PropertyName); 
dictionary.Add(1, 2); 
dictionary.Remove(1); 

Esto funciona para mí.

Pero sería más limpio implementar la interfaz IDictionary en lugar de utilizar la palabra clave new. Luego puede usar una instancia privada Dictionary dentro de su clase para garantizarle el trabajo de implementar todo por su cuenta.

+0

Funciona para mí también ... Por cierto, debe comprobar que base.Remove (obj) en realidad elimina algo :) – Rusty

+0

Ajusté Enlace a los artículos Origen del control. ¿El registro no vinculante se registra automáticamente en PropertyChanged? – yossharel

+1

@yossharel, no, para ItemsSource se está suscribiendo a INotifyCollectionChanged –

2

Parece que usted puede estar buscando una versión del diccionario de ObservableCollection (ver: MSDN), que implementa tanto INotifyCollectionChanged y INotifyPropertyChanged fuera de la caja. Tal vez revisar su implementación en un reflector puede ser útil. Se puede encontrar en el espacio de nombres System.Collections.ObjectModel en el ensamblado System.dll.

Cuestiones relacionadas