Как преобразовать список в ObservableCollection?
Я разработчик Java, новичок в С# silverlight.
в этом классе я хочу преобразовать продукты (список) в ObservableCollection.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace WPListBoxImage
{
/**It seems not work,if I just change List<Product> to ObservableCollection<Product>
public class Products : List<Product>
{
public Products()
{
BuildCollection();
}
private const string IMG_PATH = "../Images/";
public ObservableCollection<Product> DataCollection { get; set; }
public ObservableCollection<Product> BuildCollection()
{
DataCollection = new ObservableCollection<Product>();
DataCollection.Add(new Product("Haystack Code Generator for .NET", 799, IMG_PATH + "Haystack.jpg"));
DataCollection.Add(new Product("Fundamentals of N-Tier eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundNTier_100.jpg"));
DataCollection.Add(new Product("Fundamentals of ASP.NET Security eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundSecurity_100.jpg"));
DataCollection.Add(new Product("Fundamentals of SQL Server eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundSQL_100.jpg"));
DataCollection.Add(new Product("Fundamentals of VB.NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundVBNet_100.jpg"));
DataCollection.Add(new Product("Fundamentals of .NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundDotNet_100.jpg"));
DataCollection.Add(new Product("Architecting ASP.NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "ArchASPNET_100.jpg"));
DataCollection.Add(new Product("PDSA .NET Productivity Framework", Convert.ToDecimal(2500), IMG_PATH + "framework.jpg"));
return DataCollection;
}
}
}
что мне делать, чтобы исправить это? или нужно создать новый класс?
Ответы
Ответ 1
Класс Products не должен наследовать ничего.
public class Products
Доступ ко всем элементам вашей коллекции осуществляется через свойство DataCollection класса Product. Например,
Products myProducts = new Products();
ObservableCollection<Product> myData = myProducts.DataCollection;
Это также зависит от того, как вы хотите использовать Продукты. Вы можете полностью избавиться от этого класса, а затем сделать что-то вроде:
ObservableCollection<Product> Products = new ObservableCollection<Product>();
Products.Add(new Product("Haystack Code Generator for .NET", 799, IMG_PATH + "Haystack.jpg"));
// etc...
Ответ 2
В ObservableCollection
есть конструктор, который делает это:
ObservableCollection<T> oc = new ObservableCollection<T>(List<T> list);
Ответ 3
Вы можете создать метод расширения, который позволит легко преобразовать любой тип List
в ObservableCollection
.
public static class CollectionUtils
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> thisCollection)
{
if (thisCollection == null) return null;
var oc = new ObservableCollection<T>();
foreach (var item in thisCollection)
{
oc.Add(item);
}
return oc;
}
}
Например:
Products p = new Products();
//add your products
var collection = p.ToObservableCollection(); //use the extension method.
Ответ 4
Класс Products - это список. В BuildCollection вы получаете доступ к этому методу Add. На мой взгляд, вам не нужна вспомогательная структура.
Чтобы преобразовать список в ObservableCollection, используйте
this.Select<Product, ObservableCollection>(p => p)
способ на сбор.