Adding a range of values to an ObservableCollection efficiently

前端 未结 4 1294
Happy的楠姐
Happy的楠姐 2020-12-24 06:29

I have an ObservableCollection of items that is bound to a list control in my view.

I have a situation where I need to add a chunk of values to the star

4条回答
  •  余生分开走
    2020-12-24 06:55

    To make the above answer useful w/o deriving a new base class using reflection, here's an example:

    public static void InsertRange(this ObservableCollection collection, IEnumerable items)
    {
      var enumerable = items as List ?? items.ToList();
      if (collection == null || items == null || !enumerable.Any())
      {
        return;
      }
    
      Type type = collection.GetType();
    
      type.InvokeMember("CheckReentrancy", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, collection, null);
      var itemsProp = type.BaseType.GetProperty("Items", BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Instance);
      var privateItems = itemsProp.GetValue(collection) as IList;
      foreach (var item in enumerable)
      {
        privateItems.Add(item);
      }
    
      type.InvokeMember("OnPropertyChanged", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, null,
        collection, new object[] { new PropertyChangedEventArgs("Count") });
    
      type.InvokeMember("OnPropertyChanged", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, null,
        collection, new object[] { new PropertyChangedEventArgs("Item[]") });
    
      type.InvokeMember("OnCollectionChanged", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, 
        collection, new object[]{ new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)});
    }
    

提交回复
热议问题