【发布时间】:2018-01-09 20:06:53
【问题描述】:
我有一个包含单列字符串数据的 DataGrid。数据网格的 ItemsSource 是一个 DataSet。
我想通过文本框实时过滤这个。我想出了这个,主要是作为概念证明。 UsersSearchChanged 只是文本框文本更改时触发的偶数:
private void UsersSearchChanged(object sender, RoutedEventArgs e)
{
SearchForUser(SearchUsersTextBox.Text);
}
private void SearchForUser(string searchTerm)
{
var myData = usersData.Tables[0].AsEnumerable().Select(r => new
{
column1 = r.Field<string>("UserName")
});
var list = myData.ToList();
var filtered = list.Where(name => name.column1.StartsWith(searchTerm));
usersDataGrid.ItemsSource = filtered;
}
但这并不完全有效并返回错误:
"BindingExpression path error: 'UserName' property not found on 'object'..."
我什至不确定我是否正确地解决了这个问题,并且在如何继续时有点迷失。此处的目标是“实时”搜索响应文本框中每次击键的用户列表。
【问题讨论】:
-
我猜在您的 XAML 模板中,您在 usersDataGrid 的模板中定义了属性 UserName。您确实意识到您分配的列表包含具有 Column1 属性而不是 UserName 的匿名对象-您为什么还要进行选择投影?
-
嗯,你的错误有点引导你走向正确的方向。分配“myData”的部分看起来您没有“用户名”字段。我会把它切小一点开始。确保您在 usersData 中有一个具有该列的 dataTable。您总是可以使用便宜的 .Select(r => r[0]) 来获取第一列。