将List <t>转换为WP7中的ObservableCollection <t> </t> </t>

时间:2011-04-06 03:33:50

标签: c# .net windows-phone-7 collections

我不知道是否为时已晚或是什么,但我不知道如何做到这一点......

我期待做什么,以及对象浏览器所说的是:

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

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

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

如果确实不存在,那么现在用WP7执行此操作的标准方法是什么?

10 个答案:

答案 0 :(得分:87)

ObservableCollection具有几个具有List&lt; T&gt;的输入参数的构造函数。或IEnumerable&lt; T&gt;:
    List<T> list = new List<T>();
ObservableCollection<T> collection = new ObservableCollection<T>(list);

答案 1 :(得分:33)

WP 7.0不支持构造函数ObservableCollection<T>(IEnumerable<T>)ObservableCollection<T>(List<T>)。 WP 7.0中仅支持parameterless constructor。其他构造函数 在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);

答案 2 :(得分:13)

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

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

答案 3 :(得分:8)

您必须编写自己的扩展方法才能执行此操作:

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

答案 4 :(得分:6)

此答案IList<T> to ObservableCollection<T>的扩展方法效果很好

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

答案 5 :(得分:3)

ObservableCollection<FacebookUser_WallFeed> result = new ObservableCollection<FacebookUser_WallFeed>(FacebookHelper.facebookWallFeeds);

答案 6 :(得分:2)

如果您要添加大量项目,请考虑从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;
        }
    }

答案 7 :(得分:2)

我做了一个扩展所以现在我可以通过执行以下操作加载带有列表的集合:

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

答案 8 :(得分:0)

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

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

_expediteStatuses = new ObservableCollection&lt; ExpediteStatus&gt;(_ db.getExpediteStatuses());

以下是getExpediteStatuses方法的签名:

public List&lt; ExpediteStatus&gt; getExpediteStatuses()

答案 9 :(得分:0)

使用此:

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