2011-12-12 7 views
19

Mam prostą klasę z właściwością string i właściwością List i mam zaimplementowane zdarzenie INofityPropertyChanged, ale kiedy robię .Add do listy ciągów, to zdarzenie nie jest trafiane, więc mój Konwerter do wyświetlenia w ListView nie jest trafiony. Domyślam się, że zmieniona właściwość nie jest trafiona w Dodaj do listy .... w jaki sposób mogę to zaimplementować w taki sposób, aby uzyskać zmianę właściwości zdarzenia?List <string> INotifyPropertyChanged event

Czy muszę użyć innego rodzaju kolekcji ?!

Dzięki za wszelką pomoc!

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

Odpowiedz

32

należy użyć ObservableCollection<string> zamiast List<string>. A w twoim przypadku byłbym gotowy tylko do odczytu - możesz zawsze pracować z jedną instancją kolekcji.

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

To są pieniądze! Dzięki! – theDoke

+0

** Dlaczego ** należy użyć 'ObservableCollection'? – C4u

+0

@ C4u można go użyć do powiązania danych w WPF (wzorzec MVVM) – bniwredyc

2

Twoja lista nie uruchomi automatycznie zdarzenia NotifyPropertyChanged.

WPF kontroluje że narazić właściwość ItemsSource mają na celu związanie do ObservableCollection<T>, który będzie aktualizacji automatycznie, gdy elementy są dodawane lub usuwane.

7

Najprostszym sposobem na utworzenie powiązania listy plików WPF jest użycie kolekcji, która implementuje INotifyCollectionChanged. Prostą rzeczą do zrobienia jest zastąpienie lub dostosowanie listy do ObservableCollection.

Jeśli używasz ObservableCollection, to za każdym razem, gdy modyfikujesz listę, podniesione zostanie zdarzenie CollectionChanged - zdarzenie, które poinformuje wiązanie WPF o aktualizacji. Zwróć uwagę, że jeśli zamienisz rzeczywisty obiekt kolekcji, będziesz chciał podnieść zdarzenie propertychowane dla rzeczywistej właściwości kolekcji.

+0

Co zrobić, jeśli nie chcę tego używać ze względu na wydajność? – Brandon