gpt4 book ai didi

c# - List 在更改时触发事件

转载 作者:可可西里 更新时间:2023-11-01 08:52:22 25 4
gpt4 key购买 nike

我创建了一个继承 List 的类 EventList,它会在每次添加、插入或删除某些内容时触发一个事件:

public class EventList<T> : List<T>
{
public event ListChangedEventDelegate ListChanged;
public delegate void ListChangedEventDelegate();

public new void Add(T item)
{
base.Add(item);
if (ListChanged != null
&& ListChanged.GetInvocationList().Any())
{
ListChanged();
}
}
...
}

目前我将它用作这样的属性:

public EventList List
{
get { return m_List; }
set
{
m_List.ListChanged -= List_ListChanged;

m_List = value;

m_List.ListChanged += List_ListChanged;
List_ListChanged();
}
}

现在我的问题是,如果引用了一个新对象,我能否以某种方式处理或阻止它,这样我就不必在 setter 中进行事件连接?

当然,我可以将属性更改为“私有(private)集”,但我也希望能够将该类用作变量。

最佳答案

您很少在类中创建集合类的新实例。实例化一次并清除它而不是创建一个新列表。 (并使用 ObservableCollection,因为它已经继承了 INotifyCollectionChanged 接口(interface))

private readonly ObservableCollection<T> list;
public ctor() {
list = new ObservableCollection<T>();
list.CollectionChanged += listChanged;
}

public ObservableCollection<T> List { get { return list; } }

public void Clear() { list.Clear(); }

private void listChanged(object sender, NotifyCollectionChangedEventArgs args) {
// list changed
}

这样您只需连接一次事件,并且可以通过调用 clear 方法来“重置它”,而不是在属性的 set 访问器中检查 null 或与前一个列表是否相等。


随着 C#6 中的变化,您可以从构造函数中分配一个没有支持字段的 get 属性(支持字段是隐式的)

所以上面的代码可以简化为

public ctor() {
List = new ObservableCollection<T>();
List.CollectionChanged += OnListChanged;
}

public ObservableCollection<T> List { get; }

public void Clear()
{
List.Clear();
}

private void OnListChanged(object sender, NotifyCollectionChangedEventArgs args)
{
// react to list changed
}

关于c# - List<T> 在更改时触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12785019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com