Convert List<T> to ObservableCollection<T> in WP

本文关键字:gt lt in WP ObservableCollection to Convert List | 更新日期: 2023-09-27 17:48:59

我不知道是不是太迟了,但我不知道该怎么做…

我期望做的,对象浏览器显示的是:

var oc = new ObservableCollection<T>( new List<T>() );

但是ObservableCollection<T>只有一个无参数构造函数。对象浏览器说有2个重载,其中List和IEnuerable应该可以传入。

我的设置有问题吗?构造函数不在电话版本上吗?(那会很奇怪)

如果这个真的不存在,那么现在WP7的标准方法是什么?

Convert List<T> to ObservableCollection<T> in WP

ObservableCollection有几个构造函数,它们的输入参数为List<或IEnumerable>:
List<T> list = new List<T>();
ObservableCollection<T> collection = new ObservableCollection<T>(list);

显然,你的项目是针对Windows Phone 7.0。不幸的是,接受IEnumerable<T>List<T>的构造函数在WP 7.0中不可用,只能使用无参数构造函数。其他构造函数在Silverlight 4及以上版本和WP 7.1及以上版本中可用,只是在WP 7.0中不可用。

我猜你唯一的选择是把你的列表和项目单独添加到一个新的ObservableCollection实例中,因为没有现成的方法来批量添加它们。但这并不妨碍您自己将其放入扩展或静态方法中。

var list = new List<SomeType> { /* ... */ };
var oc = new ObservableCollection<SomeType>();
foreach (var item in list)
    oc.Add(item);

要将List<T> list转换为可观察集合,可以使用以下代码:

var oc = new ObservableCollection<T>();
list.ForEach(x => oc.Add(x));

您必须编写自己的扩展方法来完成此操作:

    public static class CollectionEx
    {
      /// <summary>
      /// Copies the contents of an IEnumerable list to an ObservableCollection
      /// </summary>
      /// <typeparam name="T">The type of objects in the source list</typeparam>
      /// <param name="enumerableList">The source list to be converted</param>
      /// <returns>An ObservableCollection containing the objects from the source list</returns>
      public static ObservableCollection<T> ToObservableCollection<T>( this IEnumerable<T> enumerableList )
      {
        if( enumerableList != null ) {
          // Create an emtpy observable collection object
          var observableCollection = new ObservableCollection<T>();
          // Loop through all the records and add to observable collection object
          foreach( var item in enumerableList ) {
            observableCollection.Add( item );
          }
          // Return the populated observable collection
          return observableCollection;
        }
        return null;
      }
    }

从这个答案扩展方法IListObservableCollection效果很好

public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerable) {
  var col = new ObservableCollection<T>();
  foreach ( var cur in enumerable ) {
    col.Add(cur);
  }
  return col;
}
ObservableCollection<FacebookUser_WallFeed> result = new ObservableCollection<FacebookUser_WallFeed>(FacebookHelper.facebookWallFeeds);

使用

List<Class1> myList;
ObservableCollection<Class1> myOC = new ObservableCollection<Class1>(myList);

如果你要添加很多项目,考虑从ObservableCollection中派生你自己的类,并将项目添加到受保护的items成员中——这不会在观察者中引发事件。完成后,可以引发相应的事件:

public class BulkUpdateObservableCollection<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var i in collection) Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        OnPropertyChanged(new PropertyChangedEventArgs("Count"));
    }
 }

当向已经绑定到UI元素(如LongListSelector)的ObservableCollection中添加许多项时,这会产生巨大的性能差异。

在添加项目之前,您还可以确保有足够的空间,以便通过在BulkObservableCollection类中实现此方法并在调用AddRange:

之前调用它来确保列表不会不断扩展。
    public void IncreaseCapacity(int increment)
    {
        var itemsList = (List<T>)Items;
        var total = itemsList.Count + increment;
        if (itemsList.Capacity < total)
        {
            itemsList.Capacity = total;
        }
    }

我做了一个扩展,所以现在我可以加载一个列表的集合:

MyObservableCollection.Load(MyList);

扩展名是:

public static class ObservableCollectionExtension
{
  public static ObservableCollection<T> Load<T>(this ObservableCollection<T> Collection, List<T> Source)
  {
          Collection.Clear();    
          Source.ForEach(x => Collection.Add(x));    
          return Collection;
   }
}

Zin Min提供的答案用一行代码解决了我的问题。太好了!

我遇到了同样的问题,将泛型列表转换为泛型ObservableCollection,以使用列表中的值来填充通过WPF窗口的工厂类参与绑定的ComboBox。

_expediteStatuses = new ObservableCollection(_db.getExpediteStatuses());

下面是getExpediteStatuses方法的签名:

公共ListgetExpediteStatuses ()