创建Generic StateManagedCollection的方法如下:
public class StateManagedCollection<T> : IList<T>, INotifyPropertyChanged, INotifyCollectionChanged
{
private readonly IList<T> _internalList;
public StateManagedCollection()
{
_internalList = new List<T>();
}
public StateManagedCollection(IEnumerable<T> items)
{
_internalList = new List<T>(items);
}
public event PropertyChangedEventHandler PropertyChanged;
public event NotifyCollectionChangedEventHandler CollectionChanged;
public T this[int index]
{
get => _internalList[index];
set
{
_internalList[index] = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Item[])));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, index));
}
}
public int Count => _internalList.Count;
public bool IsReadOnly => _internalList.IsReadOnly;
public void Add(T item)
{
_internalList.Add(item);
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, _internalList.IndexOf(item)));
}
public void Clear()
{
_internalList.Clear();
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public bool Contains(T item)
{
return _internalList.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
_internalList.CopyTo(array, arrayIndex);
}
public IEnumerator<T> GetEnumerator()
{
return _internalList.GetEnumerator();
}
public int IndexOf(T item)
{
return _internalList.IndexOf(item);
}
public void Insert(int index, T item)
{
_internalList.Insert(index, item);
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));
}
public bool Remove(T item)
{
var index = _internalList.IndexOf(item);
var result = _internalList.Remove(item);
if (result)
{
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
}
return result;
}
public void RemoveAt(int index)
{
var item = _internalList[index];
_internalList.RemoveAt(index);
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
}
IEnumerator IEnumerable.GetEnumerator()
{
return _internalList.GetEnumerator();
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
CollectionChanged?.Invoke(this, e);
}
}
var collection = new StateManagedCollection<string>();
collection.Add("Hello");
collection.Add("World");
foreach (var item in collection)
{
Console.WriteLine(item);
}
在这个例子中,我们创建了一个StateManagedCollection类,它实现了IList<T>接口,并且通过INotifyPropertyChanged和INotifyCollectionChanged接口来通知数据的变化。我们可以使用这个类来管理我们的数据,并且在数据发生变化时自动通知UI进行更新。
领取专属 10元无门槛券
手把手带您无忧上云