Как конвертировать список в ObservableCollection? - PullRequest
18 голосов
/ 13 марта 2012

Я Java-разработчик, новичок в C # 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;
    }
  }
}

что мне нужно сделать, чтобы это исправить?или нужно создать новый класс?

Ответы [ 4 ]

72 голосов
/ 25 декабря 2012

В ObservableCollection есть конструктор, который делает это:

ObservableCollection<T> oc = new ObservableCollection<T>(List<T> list);
7 голосов
/ 13 марта 2012

Ваш класс 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...
5 голосов
/ 13 марта 2012

Вы можете создать метод расширения, который позволит вам легко конвертировать любой тип 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.
2 голосов
/ 13 марта 2012

Класс Products представляет собой список.В BuildCollection вы получаете доступ к этому с помощью метода Add.На мой взгляд, вам не нужна вспомогательная структура.

Чтобы преобразовать список в ObservableCollection, используйте метод

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

для коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...