Как реализовать и запустить событие, когда происходит изменение в свойстве `T` в` List <T>`внутри класса-владельца - PullRequest
0 голосов
/ 07 февраля 2019

Как реализовать и запустить событие, когда происходит изменение в свойстве T в List<T> внутри класса-владельца

Я имею в виду не в самой коллекции, а в свойстве T.

Есть какой-нибудь шаблон, как это сделать?

Мой текущий код

public class Section
{
    public string Title { get; set; }
    public List<Question> Questions { get; set; } = new List<Question>();

    public int AnsweredQuestion
    {
        get
        {
            return Questions.Count(x => x.State != DeviceNodeTechStateEnum.Undefined);
        }
    }

    public int NonAnsweredQuestion
    {
        get
        {

            return Questions.Count(x => x.State == DeviceNodeTechStateEnum.Undefined);
        }
    }

    public string QuestionStats
    {
        get
        {
            return string.Format("{0}/{1}", AnsweredQuestion, Questions.Count);
        }
    }
}

public class Question : INotifyPropertyChanged
{
    public Guid ID { get; set; }

    public string _note { get; set; }
    public string Note
    {
        get
        {
            return this._note;
        }

        set
        {
            if (value != this._note)
            {
                this._note = value;
                NotifyPropertyChanged();
            }
        }
    }

    private DeviceNodeTechStateEnum _state { get; set; }
    public DeviceNodeTechStateEnum State
    {
        get
        {
            return this._state;
        }

        set
        {
            if (value != this._state)
            {
                this._state = value;
                NotifyPropertyChanged();
            }
        }
    } 

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

В основном мне нужно знать, если public DeviceNodeTechStateEnum Stateесть изменения в Section классе.

1 Ответ

0 голосов
/ 07 февраля 2019

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

public class ItemPropertyChangedNotifyingList<T> : IList<T>, INotifyPropertyChanged where T : INotifyPropertyChanged
{
    private List<T> _listImplementation = new List<T>();

    public void Add(T item)
    {
        item.PropertyChanged += ItemOnPropertyChanged;
        _listImplementation.Add(item);
    }

    private void ItemOnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        PropertyChanged?.Invoke(sender, e);
    }

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

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

    public void Clear()
    {
        _listImplementation.ForEach(x => x.PropertyChanged -= ItemOnPropertyChanged);
        _listImplementation.Clear();
    }

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

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

    public bool Remove(T item)
    {
        item.PropertyChanged -= ItemOnPropertyChanged;
        return _listImplementation.Remove(item);
    }

    public int Count => _listImplementation.Count;

    public bool IsReadOnly => false;

    public int IndexOf(T item)
    {
        return _listImplementation.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        item.PropertyChanged += ItemOnPropertyChanged;
        _listImplementation.Insert(index, item);
    }

   public void RemoveAt(int index)
    {
        if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException(nameof(index));
        _listImplementation[index].PropertyChanged -= ItemOnPropertyChanged;
        _listImplementation.RemoveAt(index);
    }

    public T this[int index]
    {
        get => _listImplementation[index];
        set => _listImplementation[index] = value;
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

При обработке событий PropertyChanged этого упакованного списка аргумент sender будет экземпляром элемента, вызвавшего событие.

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