我想通过键入文本框来搜索数据网格,但我无法找到解决方案。
我需要做任何绑定吗?如果是的话,我该怎么做?
答案 0 :(得分:0)
如果您希望在Datagrid中使用过滤器文本,即按名称,请尝试此操作...
private bool DataMatchesFilterText(User user, string filterText)
{
return user.Name.ToString() == filterText;
}
答案 1 :(得分:-1)
是的,您需要将数据网格绑定到包含所有数据的属性。 然后在文本框中添加一个事件处理程序,以处理其中一个关键事件,例如: XAML:
<TextBox x:Name="SearchBox" KeyUp="FilterTextBox_TextChanged" />
然后在后面的代码中你需要对该事件采取行动。在这里,您需要提取过滤器文本,获取DataGrid中的行,然后执行一些方法来确定它是否应该可见。您需要实现自己的DataMatchesFilterText方法。
代码隐藏:
private void FilterTextBox_TextChanged(object sender, KeyEventArgs e)
{
var filterTextBox = (TextBox)sender;
var filterText = filterTextBox.Text;
SetRowVisibilityByFilterText(filterText);
}
private void SetRowVisibilityByFilterText(string filterText)
{
GetVisibleRows(yourGrid)
.ToList()
.ForEach(
x =>
{
if (x == null) return;
x.Visibility =
DataMatchesFilterText(x.Item as YourRowProperty, filterText) ? Visibility.Visible : Visibility.Collapsed;
});
}
public static IEnumerable<DataGridRow> GetVisibleRows(DataGrid grid)
{
if (grid == null || grid.Items == null) yield break;
int count = grid.ItemsSource == null
? grid.Items.Count
: grid.ItemsSource.Cast<object>().Count();
for (int i = 0; i < count; i++)
{
yield return (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
}
}