2011-07-28 14 views
8

Wiążę typ własności ICollectionView na formantach DataGrid w WPF, .NET 4.0.Konwersja ICollectionView to List <T>

Używam Filter na 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 widok:

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

Próbuję rozwiązać ten problem:

Na przykład liczba danych źródłowych wynosi 1000 szt. Używam filtru, w kontrolce DataGrid pokazuję tylko 200 przedmiotów.

Chciałbym przekonwertować ICollection bieżący widok na IList<Call>

+0

Patrz http://stackoverflow.com/questions/187913/c-fastest-convert-from-collection -to-listt – nthpixel

Odpowiedz

0

można po prostu użyć metodę rozszerzenia do konwersji:

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

po prostu wpadł na ten problem w Silverlight, ale jej to samo w WPF:

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

13

można spróbować:

List<Call> CallsList = CallsView.Cast<Call>().ToList(); 
+0

Działa doskonale podczas pracy z 'CollectionViewSource', aby uzyskać listę aktualnie widocznych elementów w widoku. – qJake

1

Ponieważ System.Component.ICollectionView nie implementuje IList, nie można po prostu wywołać ToList(). Podobnie jak wcześniej Niloo, musisz najpierw rzucić elementy w widoku kolekcji.

Można użyć następującą metodę rozszerzenia:

/// <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(); 
} 

Zastosowanie:

var collectionViewList = MyCollectionViewSource.View.AsList<Call>();