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的标准方法是什么?
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;
}
}
从这个答案扩展方法IList
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
下面是getExpediteStatuses方法的签名:
公共List