当Collection被修改时如何发送事件

本文关键字:何发送 事件 修改 Collection | 更新日期: 2023-09-27 18:15:06

对不起,我是c#新手,尤其是事件。为什么我会收到NPE?

class WcfModel : IWcfModel
{
    private List<ConsoleData> _dataList;
    public List<ConsoleData> DataList
    {
        get { return _dataList; }
        set { _dataList = value;
            DataArrived(_dataList);  // NPE
        }
    }
    public event Action<List<ConsoleData>> DataArrived;
}

当Collection被修改时如何发送事件

如果没有对象订阅事件(即委托没有订阅者),它将是null。您需要对此进行测试:

    set { 
        _dataList = value;
        var dataDel = DataArrived;
        if(dataDel != null)
            dataDel(_dataList);  
    }

或者,使用ObservableCollection<ConsoleData> -它已经内置了事件来更改集合。

不如使用ObservableCollection<ConsoleData>,它有自己的事件发布者

class WcfModel : IWcfModel
{
    private ObservableCollection<ConsoleData> _dataList;
    public WcfModel ()
    {
        _dataList = new ObservableCollection<ConsoleData>();
        _dataList.CollectionChanged += DataArrived
    }
    public ObservableCollection<ConsoleData> DataList
    {
        get { return _dataList; }
    }
    public event Action<object, NotifyCollectionChangedEventArgs> DataArrived;
}

现在当你做

wcfModelInstance.DataList.Add(new ConsoleData("hello"));

当您订阅WcfModel中的DataArrived事件时,会收到通知。

您应该为事件添加一个空检查器,如以下代码:

  class WcfModel: IWcfModel
  {
    private List<ConsoleData> _dataList;
    public List<ConsoleData> DataList
    {
      get { return _dataList; }
      set
      {
        _dataList = value;
        if ( DataArrived != null )
          DataArrived ( _dataList );
      }
    }
    public event Action<List<ConsoleData>> DataArrived;
  }