WPF DataGrid заполняется, за исключением случаев, когда я использую LINQ для фильтрации его элементов
-
20-08-2019 - |
Вопрос
У меня есть простой 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
?
Решение
я бы попробовал две вещи :
Изменение
theDataGrid.ItemsSource = filteredContacts;
Для
theDataGrid.ItemsSource = filteredContacts.ToList();
Второй способ заключался бы в использовании представления и фильтрации по этому представлению.
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(contacts); view.Filter = delegate(object item) { return (item as Contact).LastName.StartsWith("T"); }; theDataGrid.ItemsSource = view;