Это лучший способ конвертировать List <T>из моделей в ObservableCollection <T>в представлениях? - PullRequest
4 голосов
/ 05 марта 2010

В MVVM разработка Я постоянно конвертирую List<T> из моих моделей в ObservableCollection<T> для моих просмотров.

Я искал в .NET способ сделать это кратко, например, .ToList<> или .ToArray<> или .ToDictionary<>, но не смог найти ничего похожегодля ObservableCollection .

Поэтому я сделал следующий метод расширения ConvertToObservableCollection<T>().

Есть ли лучший способ конвертировать List<T> до ObservableCollection<T>, или каждый разработчик MVVM в какой-то момент пишет этот метод расширения?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Documents;
using System.Collections.ObjectModel;

namespace TestObser228342
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List<string> names = new List<string> { "one", "two", "three" };
            ObservableCollection<string> ocNames = 
                names.ConvertToObservableCollection<string>();
            ocNames.ToList().ForEach(n => Console.WriteLine(n));

            List<Customer> customers = new List<Customer>
            {
                new Customer { FirstName = "Jim", LastName = "Smith" },
                new Customer { FirstName = "Jack", LastName = "Adams" },
                new Customer { FirstName = "Collin", LastName = "Rollins" }
            };
            ObservableCollection<Customer> ocCustomers = 
                customers.ConvertToObservableCollection<Customer>();
            ocCustomers.ToList().ForEach(c => Console.WriteLine(c));
        }
    }

    public static class StringHelpers
    {
        public static ObservableCollection<T> ConvertToObservableCollection<T>
            (this List<T> items)
        {
            ObservableCollection<T> oc = new ObservableCollection<T>();
            foreach (var item in items)
            {
                oc.Add(item);
            }
            return oc;
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public override string ToString()
        {
            return FirstName + " " + LastName;
        }
    }

}

Ответы [ 4 ]

12 голосов
/ 05 марта 2010

Почему бы вам не использовать соответствующий конструктор ObservableCollection?

ObservableCollection<Customer> ocCustomers = 
         new ObservableCollection<Customer>(customers);
1 голос
/ 29 июля 2010

Объявление переменной с помощью конструктора ObservableCollection работает и в Silverlight 4.

0 голосов
/ 06 марта 2010

ваше решение кажется слишком сложным ... может быть, мое слишком простое ... это метод расширения, который я написал для преобразования моих коллекций нетье в наблюдаемые коллекции ... его в vb.net ... но вы получите суть ...

<System.Runtime.CompilerServices.Extension()> _
    Public Function [ToObservableCollection](Of T)(ByVal list As IEnumerable(Of T)) As ObservableCollection(Of T)
        Dim collection As New ObservableCollection(Of T)

        For Each l As T In list
            collection.Add(l)
        Next

        Return collection
    End Function

вот преобразованный C #

[System.Runtime.CompilerServices.Extension()]
public ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> list)
{
    ObservableCollection<T> collection = new ObservableCollection<T>();
    
    foreach (T l in list) {
        collection.Add(l);
    }
    
    return collection;
}

Полагаю, вы могли бы использовать лямбду, но я их не понимаю, поэтому избегаю их.

0 голосов
/ 05 марта 2010
...