我有一个列表视图和一个搜索文本框。当我在文本框中键入任何字符或符号时,它会将键入的文本与列表框项匹配。如果有任何匹配,则会突出显示匹配的项目。在这一点上,我想从列表视图中删除不匹配的项目。只有匹配的项目才会保留在列表视图中。你建议我解决这个问题?我的其他代码如下。
private void TxtSearch_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
ListControl lc = getactivListview();
FindListViewItem(lc);
}
private void FindListViewItem(DependencyObject obj)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
ListViewItem lv = obj as ListViewItem;
if (lv != null)
{
HighlightText(lv);
}
FindListViewItem(VisualTreeHelper.GetChild(obj as DependencyObject, i));
}
}
private void HighlightText(Object itx)
{
if (itx != null)
{
if (itx is TextBlock)
{
Regex regex = new Regex("(" +TxtSearch.Text + ")", RegexOptions.IgnoreCase);
TextBlock tb = itx as TextBlock;
if (TxtSearch.Text.Length == 0)
{
string str = tb.Text;
tb.Inlines.Clear();
tb.Inlines.Add(str);
return;
}
string[] substrings = regex.Split(tb.Text);
tb.Inlines.Clear();
foreach (var item in substrings)
{
if (regex.Match(item).Success)
{
Run runx = new Run(item);
runx.Background = Brushes.Lime;
tb.Inlines.Add(runx);
if (tb.IsMouseOver)
{
tb.IsEnabled = false;
}
}
else
{
tb.Inlines.Add(item);
tb.IsEnabled = false;
}
}
return;
}
else
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(itx as DependencyObject); i++)
{
HighlightText(VisualTreeHelper.GetChild(itx as DependencyObject, i));
}
}
}
}
答案 0 :(得分:0)
嗯,WPF
中最简单,最自然的方法是使用数据绑定和过滤ModelView
集合。
例如:
public class ModelView
{
private IEnumerable<Data> _data = ....
public string Filtrer {get;set;}
public IEnumerable<Data> GetData() {
return FilteredData();
}
private IEnumerable<Data> FilteredData()
{
if(string.IsNullOrEmpty(Filter))
return _data;
return _data.Where(x=>x...Filter); //SOME CONDITON EXECUTION
}
}
绑定到视图GetData()
,根据过滤字符串的缺失或存在,返回完整或过滤集合。
如同一个例子,如何在ListView
上实现数据绑定(这不是一个镜头主题,在这个简单的答案中几乎无法解释),可以查看:Data Binding in WPF ListView