WPF DataGrid заполняется, за исключением случаев, когда я использую LINQ для фильтрации его элементов

StackOverflow https://stackoverflow.com/questions/503014

Вопрос

У меня есть простой WPFToolkit DataGrid:

<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;
    }
}

В моем главном конструкторе в code behind я создаю List коллекцию и привяжите ее к моему 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?

Это было полезно?

Решение

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

  1. Изменение

    theDataGrid.ItemsSource = filteredContacts;
    

    Для

    theDataGrid.ItemsSource = filteredContacts.ToList();
    
  2. Второй способ заключался бы в использовании представления и фильтрации по этому представлению.

    ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(contacts);
    
    view.Filter = delegate(object item) { return (item as Contact).LastName.StartsWith("T"); };
    
    theDataGrid.ItemsSource = view;
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top