如何在修改Collection时发送事件?

时间:2011-11-19 10:00:05

标签: c#

抱歉,我是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;
}

3 个答案:

答案 0 :(得分:3)

如果没有对象订阅该事件(即委托没有订阅者),则它将是null。你需要测试一下:

    set { 
        _dataList = value;

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

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

答案 1 :(得分:1)

而是使用具有自己的事件发布者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"));

当您在DataArrived订阅WcfModel活动时,系统会通知您。

希望这有帮助。

答案 2 :(得分:0)

您应该为事件添加一个null检查器,如下所示:

  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;
  }