Преобразовать ICollectionView в список <T> - PullRequest
11 голосов
/ 28 июля 2011

Я связываю тип свойства ICollectionView для элементов управления DataGrid в WPF, .NET 4.0.

Я использую Filter на ICollectionView.

    public ICollectionView CallsView
    {
        get
        {
            return _callsView;
        }
        set
        {
            _callsView = value;
            NotifyOfPropertyChange(() => CallsView);
        }
    }

    private void FilterCalls()
    {
        if (CallsView != null)
        {
            CallsView.Filter = new Predicate<object>(FilterOut);
            CallsView.Refresh();
        }
    }

    private bool FilterOut(object item)
    {
       //..
    }

Представление Init ICollection:

IList<Call> source;
CallsView = CollectionViewSource.GetDefaultView(source);

Я пытаюсь решить эту проблему:

Например, количество исходных данных составляет 1000 единиц. Я использую фильтр, в контроле DataGrid я показываю только 200 наименований.

Я хотел бы преобразовать ICollection текущий вид в IList<Call>

Ответы [ 4 ]

19 голосов
/ 08 января 2014

Вы можете попробовать:

List<Call> CallsList = CallsView.Cast<Call>().ToList();
1 голос
/ 09 апреля 2014

Поскольку System.Component.ICollectionView не реализует IList, вы не можете просто вызвать ToList (). Как уже ответил Niloo, вам сначала нужно разыграть предметы в виде коллекции.

Вы можете использовать следующий метод расширения:

/// <summary>
/// Casts a System.ComponentModel.ICollectionView of as a System.Collections.Generic.List&lt;T&gt; of the specified type.
/// </summary>
/// <typeparam name="TResult">The type to cast the elements of <paramref name="source"/> to.</typeparam>
/// <param name="source">The System.ComponentModel.ICollectionView that needs to be casted to a System.Collections.Generic.List&lt;T&gt; of the specified type.</param>
/// <returns>A System.Collections.Generic.List&lt;T&gt; that contains each element of the <paramref name="source"/>
/// sequence cast to the specified type.</returns>
/// <exception cref="ArgumentNullException"><paramref name="source"/> is <c>null</c>.</exception>
/// <exception cref="InvalidCastException">An element in the sequence cannot be cast to the type <typeparamref name="TResult"/>.</exception>
[SuppressMessage("Microsoft.Design", "CA1002:DoNotExposeGenericLists", Justification = "Method is provided for convenience.")]
public static List<TResult> AsList<TResult>(this ICollectionView source)
{
    return source.Cast<TResult>().ToList();
}

Использование:

var collectionViewList = MyCollectionViewSource.View.AsList<Call>();
1 голос
/ 29 января 2013

Я только что столкнулся с этой проблемой в Silverlight, но то же самое в WPF:

IEnumerable<call> calls = collectionViewSource.View.Cast<call>();

0 голосов
/ 01 марта 2012

Можете ли вы просто использовать метод расширения для преобразования:

IList<Call> source = collection.ToList();
...