2011-12-12 15 views
19

Tengo una clase simple con una propiedad de cadena y una propiedad List y tengo el evento INofityPropertyChanged implementado, pero cuando hago un .Add a la cadena List este evento no se golpea para que mi convertidor se muestre en el ListView no se golpea. Supongo que la propiedad modificada no se ve afectada por un Agregar a la Lista ... ¿cómo puedo implementar esto de manera que la propiedad cambie?Lista <string> Evento INotifyPropertyChanged

¿Debo utilizar algún otro tipo de colección?

¡Gracias por cualquier ayuda!

namespace SVNQuickOpen.Configuration 
{ 
    public class DatabaseRecord : INotifyPropertyChanged 
    { 
     public DatabaseRecord() 
     { 
      IncludeFolders = new List<string>(); 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void Notify(string propName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
      } 
     } 
     #endregion 

     private string _name; 

     public string Name 
     { 
      get { return _name; } 

      set 
      { 
       this._name = value; 
       Notify("Name"); 
      } 
     } 

     private List<string> _includeFolders; 

     public List<string> IncludeFolders 
     { 
      get { return _includeFolders; } 

      set 
      { 
       this._includeFolders = value; 
       Notify("IncludeFolders"); 
      } 
     } 
    } 
} 

Respuesta

32

Debe utilizar ObservableCollection<string> en lugar de List<string>. Y en su caso yo haría _includeFolders de solo lectura; siempre puede trabajar con una instancia de la colección.

public class DatabaseRecord : INotifyPropertyChanged 
{ 
    private readonly ObservableCollection<string> _includeFolders; 

    public ObservableCollection<string> IncludeFolders 
    { 
     get { return _includeFolders; } 
    } 

    public DatabaseRecord() 
    { 
     _includeFolders = new ObservableCollection<string>(); 
     _includeFolders.CollectionChanged += IncludeFolders_CollectionChanged; 
    } 

    private void IncludeFolders_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     Notify("IncludeFolders"); 
    } 

    ... 

} 
+0

¡Esto es dinero! ¡Gracias! – theDoke

+0

** ¿Por qué ** debería uno usar 'ObservableCollection'? – C4u

+0

@ C4u se puede utilizar para el enlace de datos en WPF (patrón MVVM) – bniwredyc

2

Su lista no activará automáticamente el evento NotifyPropertyChanged.

WPF controla que exponen una propiedad ItemsSource están diseñados para ser unido a un ObservableCollection<T>, que voluntad actualización automáticamente cuando se añaden o eliminan elementos.

7

La manera más fácil de hacer que la lista de WPF trabaje es usar una colección que implementa INotifyCollectionChanged. Una cosa simple que hacer aquí es reemplazar o adaptar su lista con un ObservableCollection.

Si usa ObservableCollection, cada vez que modifique la lista, se iniciará el evento CollectionChanged, un evento que indicará al enlace de WPF que debe actualizarse. Tenga en cuenta que si intercambia el objeto de la colección real, querrá aumentar el evento modificado de la propiedad de la colección real.

+0

¿Qué sucede si no quiero utilizar esto por motivos de rendimiento? – Brandon

Cuestiones relacionadas