在 WP7中将 List < T > 转换为 Observer ableCollection < T >

我不知道现在是不是太晚了但我不知道该怎么做。

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

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

但是 ObservableCollection<T>只有一个无参数构造函数。对象浏览器指出,在 List 和 IEnuable 应该能够传入的地方有2个重载。

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

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

137819 次浏览

显然,您的项目的目标是 Windows Phone 7.0。遗憾的是,WP 7.0中没有接受 IEnumerable<T>List<T>的构造函数,只有 无参数构造函数无参数构造函数可用。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);

但是如果没有必要,不要这样做,如果您的目标是提供重载的框架,那么就使用它们。

从这个答案扩展方法 IList < T > 到观察收集 < 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;
}

您必须编写自己的扩展方法来实现这一点:

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

如果要添加大量项,可以考虑从 Observer ableCollection 派生自己的类,并将项添加到 protected 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)的 Observer ableCollection 添加许多项时,可能会产生巨大的性能差异。

在添加项之前,您还可以确保拥有足够的空间,这样列表就不会通过在 BulkObserver ableCollection 类中实现该方法并在调用 AddRange 之前调用该方法而不断扩展:

    public void IncreaseCapacity(int increment)
{
var itemsList = (List<T>)Items;
var total = itemsList.Count + increment;
if (itemsList.Capacity < total)
{
itemsList.Capacity = total;
}
}

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

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

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

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

我遇到了同样的问题,即将一个泛型 List 转换为一个泛型 Observer ableCollection,以使用 List 中的值来填充 ComboBox,该 ComboBox 通过 WPF 窗口的工厂类参与绑定。

= new Observer ableCollection < ExpediteStatus > (_ db.getExpediteStatus ()) ;

下面是 getExpediteStatus 方法的签名:

Public List < ExpediteStatus > getExpediteStatus ()

我做了一个扩展,所以现在我可以只加载一个集合与一个列表通过这样做:

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

用这个:

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