2012-03-13 20 views
18

Jestem programistą java, nowym w C# silverlight. w tej klasie chcę Konwertować produkty (Lista) do ObservableCollection.Jak konwertować listę do 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; 
    } 
    } 
} 

co należy zrobić, aby to naprawić? lub potrzebujesz stworzyć nową klasę?

Odpowiedz

7

Twój klasy produkty nie powinny nic dziedziczyć.

public class Products 

Dostęp do wszystkich elementów w kolekcji odbywa się za pośrednictwem właściwości DataCollection klasy produktu. Na przykład,

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

To zależy również od tego, jak chcesz korzystać z produktów. Możesz być w stanie całkowicie pozbyć się tej klasie, a następnie zrobić coś takiego:

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

Jesteś geniuszem! Rzeczywiście, byłem zdezorientowany na to pytanie yestoday.Ale nie mogę znaleźć rozwiązania do tej pory. Czy możesz pójść do tego [link] (http://stackoverflow.com/questions/9662479/remove-an-item-from -listbox-in-wp7) i Wklej tę odpowiedź, bo ktoś miał jakiś problem, zaznaczę odpowiedź. –

+0

Cieszę się, że było pomocne. Będę pisać również w drugim pytaniu. –

2

Klasa Produkty to lista. W BuildCollection uzyskujesz dostęp do tego za pomocą metody Add. W mojej opinii nie potrzebujesz struktury pomocniczej.

Aby przekonwertować lista do ObservableCollection używać

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

metody w kolekcji.

+0

Mówisz Produkty być już ObservableCollection? –

5

Można utworzyć metodę rozszerzenia, która pozwoli łatwo przekonwertować dowolny typ List na 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; 
    } 
} 

Na przykład:

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

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

Jest to dobry Utils. Będę spróbować następnym razem. Dziękuję, że jesteś. –

+0

właśnie zauważyłem, że to faktycznie nie zwróciło ObservableCollection. zaktualizowano –

71

Jest konstruktor w ObservableCollection że robi to:

ObservableCollection<T> oc = new ObservableCollection<T>(List<T> list); 
Powiązane problemy