2012-03-13 11 views
18

Tôi là một nhà phát triển java, mới cho C# silverlight. trong lớp học này tôi muốn chuyển đổi Sản phẩm (Danh sách) thành ObservableCollection.Làm cách nào để chuyển đổi danh sách thành 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; 
    } 
    } 
} 

Tôi nên làm gì để khắc phục sự cố? hoặc cần tạo một lớp học mới?

Trả lời

7

lớp Sản phẩm của bạn không nên thừa hưởng bất cứ điều gì.

public class Products 

Truy cập tất cả các mục trong bộ sưu tập của bạn được thực hiện thông qua thuộc tính DataCollection của lớp Sản phẩm. Ví dụ:

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

Nó cũng tùy thuộc vào cách bạn muốn sử dụng Sản phẩm. Bạn có thể hoàn toàn loại bỏ các lớp này và sau đó làm điều gì đó như:

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

Bạn là thiên tài! Thật vậy, tôi đã nhầm lẫn cho câu hỏi này yestoday.but không thể tìm thấy giải pháp cho đến bây giờ. Bạn có tâm trí đi đến [link] này (http://stackoverflow.com/questions/9662479/remove-an-item-từ -listbox-in-wp7) và Dán câu trả lời này cho ai đó gặp sự cố, tôi sẽ đánh dấu câu trả lời. –

+0

Tôi rất vui vì điều đó hữu ích. Tôi cũng sẽ đăng trong câu hỏi khác. –

2

Sản phẩm hạng là danh sách. Trong BuildCollection bạn truy cập nó bằng phương thức Add. Bạn không cần một cấu trúc phụ trợ theo ý kiến ​​của tôi.

Để chuyển đổi danh sách để ObservableCollection sử dụng

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

phương pháp trên bộ sưu tập.

+0

Bạn nói Sản phẩm đã trở thành một ObservableCollection? –

5

Bạn có thể tạo phương thức tiện ích mở rộng cho phép bạn chuyển đổi mọi loại List thành ObservableCollection dễ dàng.

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

Ví dụ:

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

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

Đó là một Utils.I tốt sẽ được thử thời gian tiếp theo. Cảm ơn bạn willmel. –

+0

chỉ nhận thấy điều này đã không thực sự trở lại ObservableCollection. cập nhật –

71

Có một constructor trong ObservableCollection mà thực hiện điều này:

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