2012-03-13 21 views
18

Soy un desarrollador de Java, nuevo en C# silverlight. en esta clase Quiero Convertir los Productos (Lista) a ObservableCollection.Cómo convertir la lista a 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; 
    } 
    } 
} 

¿Qué debo hacer para arreglarlo? o necesitas crear una nueva clase?

Respuesta

7

Su clase productos no deben heredar nada.

public class Products 

El acceso a todos los elementos de su colección se realiza a través de la propiedad DataCollection de la clase Product. Por ejemplo,

Products myProducts = new Products(); 
ObservableCollection<Product> myData = myProducts.DataCollection; 

También depende de cómo desee utilizar los Productos. Usted puede ser capaz de hacer totalmente lejos con esta clase y luego hacer algo como:

ObservableCollection<Product> Products = new ObservableCollection<Product>(); 
Products.Add(new Product("Haystack Code Generator for .NET", 799, IMG_PATH + "Haystack.jpg")); 
// etc... 
+0

¡Eres genial! De hecho, me he sentido confundido por esta pregunta hoy. Pero no puedo encontrar una solución hasta ahora. ¿Te importa ir a este [enlace] (http://stackoverflow.com/questions/9662479/remove-an-item-from -listbox-in-wp7), y pegue esta respuesta porque alguien tuvo algún problema, marcaré la respuesta. –

+0

Me alegra que haya sido útil. Publicaré en la otra pregunta también. –

2

La clase Products es una lista. En BuildCollection accedes a esto con el método Add. No necesita una estructura auxiliar en mi opinión.

Convertir lista para usar ObservableCollection

this.Select<Product, ObservableCollection>(p => p) 

método de colección.

+0

Usted dice que los productos ya sea un ObservableCollection? –

5

Puede hacer un método de extensión que le permita convertir cualquier tipo de List en un ObservableCollection fácilmente.

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

Por ejemplo:

Products p = new Products(); 
//add your products 

var collection = p.ToObservableCollection(); //use the extension method. 
+0

Es un buen Utils.Is intentaré la próxima vez.Gracias willmel. –

+0

acaba de notar que esto no devolvía realmente una ObservableCollection. actualizado –

71

Hay un constructor en ObservableCollection que hace esto:

ObservableCollection<T> oc = new ObservableCollection<T>(List<T> list); 
Cuestiones relacionadas