2010-11-25 1 views
3

У меня есть что-то вроде этого:SortedSet с INotifyPropertyChanged

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

Я хочу знать, в CMain если что-то изменилось в CPeople, был добавлен новый человек или удален, или что-то изменилось в некоторых CPerson в CPeople, у меня есть реализован INotifyPropertyChanged на CPerson, но у меня нет блестящей идеи о том, что интерфейс реализует на уровне CPeople и как в хорошем смысле выбраться PropertyChanged событие за CPeople до CMain.

Может ли кто-нибудь мне помочь? Приветствия.

ответ

6

Я бы использовал ObservableCollection<Person>. Если вам действительно нужен SortedSet, вы также можете реализовать интерфейсы INotifyCollectionChanged и INotifyPropertyChanged.

Одним из способов вы можете идти вперед может быть, чтобы создать ваш класс коллекции, обернутые вокруг SortedSet, например, так:

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

Спасибо ;-) хорошая идея ;-) – Svisstack 2010-11-26 01:30:48

0

Создайте свой собственный интерфейс, IPeopleChanged и т.д., с событиями как PersonAdded(Person p), PersonRemoved(Person p), и что-то вроде PersonPropertyChanged(Person p,PropertyChangedEventArgs arg), используйте метод добавления в вашей коллекции, чтобы подписаться вашу коллекцию изменения свойств событий из ваших пунктов добавлены в коллекцию, и пузырь и подписаться на события в вашей коллекции в CMain.

Итак, в итоге ваша коллекция теперь имеет 3 события, которые срабатывают при добавлении элемента, когда удаляется элемент, и тот, который передает событие PropertyChanged по цепочке при изменении элемента.

1

Если вам нужно использовать SortedSet <> возможно, вы могли бы создать класс потомков (из SortedSet <>), который реализует INotifyCollectionChanged. Или если вы не привязаны к SortedSet <> используйте ObservableCollection <> вместо этого.