2010-11-25 5 views
3

j'ai quelque chose comme ceci:SortedSet avec INotifyPropertyChanged

public class CPerson: INotifyPropertyChanged 
public class CPeople: SortedSet<CPerson> 
public class CMain 
{ 
    private CPeople _people; 
} 

Je veux savoir dans CMain si quelque chose a été modifié en CPeople, personne a été ajoutée ou supprimée ou quelque chose a été changé en quelque CPerson dans CPeople, j'ai mis en œuvre INotifyPropertyChanged sur CPerson mais je n'ai aucune idée brillante quelle interface mettre en œuvre sur la classe CPeople et comment de manière efficace sortir événement sur CPeople à CMain.

Quelqu'un peut-il m'aider? Salutations.

Répondre

6

J'utiliserais ObservableCollection<Person>. Si vous avez vraiment besoin d'un SortedSet, vous pouvez également implémenter les interfaces INotifyCollectionChanged et INotifyPropertyChanged vous-même.

Une façon vous pouvez aller de l'avant pourrait être de créer votre classe de collection enroulée autour SortedSet, comme ceci:

public class ObservableSortedSet<T> : ICollection<T>, 
             INotifyCollectionChanged, 
             INotifyPropertyChanged 
{ 
    readonly SortedSet<T> _innerCollection = new SortedSet<T>(); 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _innerCollection.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Add(T item) 
    { 
     _innerCollection.Add(item); 
     // TODO, notify collection change 
    } 

    public void Clear() 
    { 
     _innerCollection.Clear(); 
     // TODO, notify collection change 
    } 

    public bool Contains(T item) 
    { 
     return _innerCollection.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _innerCollection.CopyTo(array, arrayIndex); 
    } 

    public bool Remove(T item) 
    { 
     _innerCollection.Remove(item); 
     // TODO, notify collection change 
    } 

    public int Count 
    { 
     get { return _innerCollection.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return ((ICollection<T>)_innerCollection).IsReadOnly; } 
    } 

    // TODO: possibly add some specific methods, if needed 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 
    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

bonne idée merci ;-) – Svisstack

0

Créez votre propre interface, IPeopleChanged etc, avec des événements comme PersonAdded(Person p), PersonRemoved(Person p), et quelque chose comme PersonPropertyChanged(Person p,PropertyChangedEventArgs arg), utilisez la méthode d'ajout dans votre collection pour vous abonner votre collection aux événements changement de propriété de vos articles ajoutés à la collection, et la bulle ceux-ci, et abonnez-vous aux événements de votre collection dans CMain. Pour résumer, votre collection a désormais 3 événements: un qui se déclenche lorsqu'un élément est ajouté, un autre lorsqu'un élément est supprimé et un autre qui transmet l'événement PropertyChanged le long de la chaîne lorsqu'un élément a été modifié.

1

Si vous devez utiliser SortedSet <> vous pourriez peut-être créer une classe descendante (à partir de SortedSet <>) qui implémente INotifyCollectionChanged. Ou si vous n'êtes pas lié à SortedSet <> utilisez plutôt ObservableCollection <>.

Questions connexes