SortedSet с INotifyPropertyChanged - PullRequest
       1

SortedSet с INotifyPropertyChanged

3 голосов
/ 26 ноября 2010

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

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.

Кто-нибудь может мне помочь? Привет.

Ответы [ 3 ]

6 голосов
/ 26 ноября 2010

Я бы использовал 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;
}
1 голос
/ 26 ноября 2010

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

0 голосов
/ 26 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...