WPF Datagrid gefüllt ist, außer wenn ich LINQ verwenden ihre Elemente filtern
-
20-08-2019 - |
Frage
Ich habe einen einfachen WPFToolkit DataGrid
bekomme:
<Grid>
<dg:DataGrid Name="theDataGrid"/>
</Grid>
Und in Code hinter einer einfachen Contact
Klasse:
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;
}
}
In meinem Haupt-Konstruktor in Code-behind, baue ich eine List
Sammlung und binden Sie es an meine 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;
und das funktioniert gut, aber wenn ich diese Kontakte mit LINQ wie folgt filtern:
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;
Dann ist mein DataGrid
ist bevölkert, aber die Felder sind leer (!). Zum Beispiel in dem obigen Fall, mein DataGrid
hat drei Reihen, die alle leer sind. Merkwürdiger beim Debuggen, filteredContacts
enthält vier Elemente.
Wie kann ich LINQ verwenden, um meine benutzerdefinierte Objekte zu filtern und erhalten sie in meinem DataGrid
angezeigt werden?
Lösung
Ich würde versuchen, zwei Dinge:
-
Ändern
theDataGrid.ItemsSource = filteredContacts;
theDataGrid.ItemsSource = filteredContacts.ToList();
-
Die zweite wäre, eine Ansicht und Filter auf der Ansicht zu verwenden.
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(contacts); view.Filter = delegate(object item) { return (item as Contact).LastName.StartsWith("T"); }; theDataGrid.ItemsSource = view;