2011-12-12 9 views
19

Ho una classe semplice con una proprietà stringa e una proprietà List e ho implementato l'evento INofityPropertyChanged, ma quando eseguo un .Add alla stringa List questo evento non viene colpito in modo che il mio Convertitore visualizzi in il ListView non viene colpito. Sto indovinando che la proprietà cambiata non viene colpita per un Aggiungi alla lista .... come posso implementare questo in modo da ottenere che la proprietà abbia cambiato il colpo all'evento ???Elenco <string> Evento InotifyPropertyChanged

Devo utilizzare qualche altro tipo di raccolta ?!

Grazie per qualsiasi aiuto!

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

risposta

32

Si consiglia di utilizzare ObservableCollection<string> invece di List<string>. E nel tuo caso farei readerly _includeFolders - puoi sempre lavorare con una istanza della collezione.

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

Questo è denaro! Grazie! – theDoke

+0

** Perché ** si dovrebbe usare 'ObservableCollection'? – C4u

+0

@ C4u può essere utilizzato per l'associazione dati in WPF (pattern MVVM) – bniwredyc

2

L'elenco non attiva automaticamente l'evento NotifyPropertyChanged.

controlli WPF che espongono una proprietà ItemsSource sono progettati per essere vincolato ad un ObservableCollection<T>, che verrà aggiornamento automaticamente quando vengono aggiunti o rimossi elementi.

7

Il modo più semplice per eseguire il binding di elenchi di WPF è utilizzare una raccolta che implementa INotifyCollectionChanged. Una semplice cosa da fare qui è di sostituire o adattare la tua lista con un ObservableCollection.

Se si utilizza ObservableCollection, ogni volta che si modifica l'elenco, verrà generato l'evento CollectionChanged, un evento che indicherà il binding WPF da aggiornare. Si noti che se si sostituisce l'oggetto di raccolta effettivo, si vorrà aumentare l'evento propertychanged per la proprietà della raccolta effettiva.

+0

E se non volessi usarlo per motivi di prestazioni? – Brandon

Problemi correlati