2009-02-02 5 views
0

У меня есть простой WPFToolkit DataGrid:WPF DataGrid заполняется только при использовании LINQ для фильтрации его элементов

<Grid> 
    <dg:DataGrid Name="theDataGrid"/> 
</Grid> 

И в коде позади простого Contact класса:

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

    public Contact(string firstName, string lastName) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
    } 
} 

В моих главный конструктор позади кода, я собираю коллекцию и привяжу ее к моим DataGrid:

List<Contact> contacts = new List<Contact>(); 
contacts.Add(new Contact("John", "Tester")); 
contacts.Add(new Contact("Jill", "Tester")); 
contacts.Add(new Contact("Joe", "Tester")); 
contacts.Add(new Contact("Jimmy", "Nontester")); 
theDataGrid.ItemsSource = contacts; 

и что работает отлично, но если я фильтровать эти контакты с LINQ, как это: (!)

List<Contact> contacts = new List<Contact>(); 
contacts.Add(new Contact("John", "Tester")); 
contacts.Add(new Contact("Jill", "Tester")); 
contacts.Add(new Contact("Joe", "Tester")); 
contacts.Add(new Contact("Jimmy", "Nontester")); 

var filteredContacts = contacts.Where(contact => contact.LastName.StartsWith("T")); 
theDataGrid.ItemsSource = filteredContacts; 

Тогда мой DataGrid заселена, но поля пусты. Например, в приведенном выше случае мой DataGrid имеет три строки, все из которых пусты. Странно, когда отладка, filteredContacts содержит четыре элемента.

Как использовать LINQ для фильтрации моих пользовательских объектов и заставить их отображать в моем DataGrid?

ответ

3

я хотел бы попробовать две вещи:

  1. Изменить

    theDataGrid.ItemsSource = filteredContacts; 
    

    в

    theDataGrid.ItemsSource = filteredContacts.ToList(); 
    
  2. Второй будет использовать вид и фильтр на View.

    ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(contacts); 
    
    view.Filter = delegate(object item) { return (item as Contact).LastName.StartsWith("T"); }; 
    
    theDataGrid.ItemsSource = view; 
    
+0

Ваше первое предложение работало отлично, спасибо! :-) –

+0

CollectionViewSource - лучший способ пойти, это сделано для того, чтобы сделать это точно. У меня есть пример на моем сайте, если вы смотрите http://www.jarloo.com/excel-like-autofilter-in-wpf/ – Kelly