列表<>属性更改事件

  • 本文关键字:事件 列表 属性 c#
  • 更新时间 :
  • 英文 :


我正在处理一个项目,在该项目中,我需要通知GUI我的列表有新项。

我在observalecollection中尝试过这一点,但我使用计时器,当我尝试从observaleCollection中添加或删除项时,会抛出一个异常,即该集合是从另一个线程整理的。

因此,我开始考虑使用PropertyChanged事件。然而,我很难让它发挥作用。据我所知,它是用于房地产的。我尝试了以下代码,但没有成功:

public class MyCollection : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ConcurrentQueue<PC_Info_Item> data;
public List<string> table;
public MyCollection()
{
data = new ConcurrentQueue<PC_Info_Item>();
table = new List<string>();
}
public void Add(PC_Info_Item item)
{
data.Enqueue(item);
OnPropertyChanged(nameof(table));
}
public void Add(string item)
{
table.Add(item);
OnPropertyChanged(nameof(table));
}
public void delete()
{
data.TryDequeue(out PC_Info_Item item);
OnPropertyChanged(nameof(table));
}
public void delete_string(string item)
{
table.Remove(item);
OnPropertyChanged(nameof(table));
}
protected void OnPropertyChanged(string name = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}

有没有一种方法可以使列表起作用?

您可以将调用封装到锁中,这将使其他线程等待调用完成。

private readonly object CollectionLock = new object(); 

public void Add(PC_Info_Item item)
{
lock(CollectionLock) {
data.Enqueue(item);
}
}
public void Add(string item)
{
lock(CollectionLock) {
table.Add(item);
}
}
public void delete()
{
lock(CollectionLock) {
data.TryDequeue(out PC_Info_Item item);
}
}
public void delete_string(string item)
{
lock(CollectionLock) {
table.Remove(item);
}
}

我认为您应该调用如下更改的属性,在这里我们应该获得调用列表,并在每个带锁的接收器上调用invoke。

private object _lock = new object();
protected void OnPropertyChanged(string name = "")
{
var receivers = this.PropertyChanged.GetInvocationList();
foreach (EventHandler<PropertyChangedEventArgs> receiver in receivers)
{
lock (this._lock)
{
receiver?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}

最新更新