Silverlight 实施";键入时搜索";银光中

Silverlight 实施";键入时搜索";银光中,silverlight,silverlight-4.0,Silverlight,Silverlight 4.0,我正在尝试在Silverlight应用程序中键入时执行搜索。我的想法是,我有一个带有文本编辑控件和列表框的屏幕。列表框中充满了我的所有数据 当用户在文本框中键入内容时,会发生以下情况: 不包含用户输入的所有字母的所有项目都将隐藏 可见列表项的匹配字母以不同颜色高亮显示 我不知道如何开始与此,所以所有的指针,样本和提示是欢迎的 您可能希望从中的自动完成框开始 它有许多方便的地方,您可以在这些地方扩展它的功能,例如在实例中搜索您的值池 我建议使用CollectionViewSource。Coll

我正在尝试在Silverlight应用程序中键入时执行搜索。我的想法是,我有一个带有文本编辑控件和列表框的屏幕。列表框中充满了我的所有数据

当用户在文本框中键入内容时,会发生以下情况:

  • 不包含用户输入的所有字母的所有项目都将隐藏
  • 可见列表项的匹配字母以不同颜色高亮显示

我不知道如何开始与此,所以所有的指针,样本和提示是欢迎的

您可能希望从中的自动完成框开始


它有许多方便的地方,您可以在这些地方扩展它的功能,例如在实例中搜索您的值池

我建议使用CollectionViewSource。CollectionViewSource能够过滤项目。您可以将ListBox绑定到CollectionViewSource并处理筛选器事件以进行筛选。将“搜索框”绑定到可在筛选事件中使用的文本属性。通过调用CollectionViewSource视图上的Refresh方法,可以处理TextBox控件的“KeyUp”事件来启动过滤

使用CollectionViewSource筛选数据:

Sudo代码:

// ViewModel - properties should fire NotifyPropertyChanged
public class ViewModel : INotifyPropertyChanged
{
  public ViewModel
  {
    this.Data = new CollectionViewSource();
    this.Data.Source = this.GenerateObjects();
    this.Data.Filter += (s,e) =>
    {
      // TODO: add filter logic
      DataObject item = e.Item as DataObject;
      return item.Name.Contains(this.SearchText);
    };
  }
  public string SearchText{get;set;}
  public CollectionViewSource Data {get;set;}

  private List<DataObject> GenerateObjects(){ // generate list of data objects }
}

// View XAML
<StackPanel>
  <TextBox Text="{Binding SearchText, Mode=TwoWay}" KeyUp="OnKeyUp"/>

  <ListBox ItemsSource="{Binding Data.View}"/>
</StackPanel>


// View Code Behind
public class View : UserControl
{
  public View() { this.DataContext = new ViewModel(); }

  private ViewModel ViewModel { get { return this.DataContext as ViewModel; } }

  private OnKeyUp()
  {
    this.ViewModel.Data.View.Refresh();
  }
}
//ViewModel-属性应激发NotifyPropertyChanged
公共类视图模型:INotifyPropertyChanged
{
公共视图模型
{
this.Data=new CollectionViewSource();
this.Data.Source=this.GenerateObjects();
this.Data.Filter+=(s,e)=>
{
//TODO:添加过滤器逻辑
DataObject item=e.作为DataObject的项目;
return item.Name.Contains(this.SearchText);
};
}
公共字符串SearchText{get;set;}
公共集合ViewSource数据{get;set;}
私有列表生成对象(){//生成数据对象列表}
}
//查看XAML
//查看代码隐藏
公共类视图:UserControl
{
public View(){this.DataContext=new ViewModel();}
私有ViewModel ViewModel{get{返回this.DataContext作为ViewModel;}}
私有OnKeyUp()
{
this.ViewModel.Data.View.Refresh();
}
}

你好,拉尔夫!谢谢你的提示。我会试试看。我唯一的问题是,我需要将它从组合框更改为编辑和列表框控件。我会尝试一下。安装工具包后,您将获得一个示例应用程序来探索。您将看到他们演示如何使用datagrid作为自定义选择器的众多选项之一。@Joe这看起来非常好。你知道如何突出显示我搜索字符串中项目上的字母吗?是的,你可以使用Jeff Wilcox的突出显示文本块。太棒了,非常感谢您突出显示textblock Suggestion任何绑定到UI的属性,在本例中是SearchText和Data属性。@Joe,如果我理解正确,INotifyPropertyChanged只需通知UI控件底层数据的更改即可。这是正确的吗?我试图实现您的示例,{Binding SearchText,Mode=TwoWay}绑定没有更新viewmodel中的SearchText,因此搜索总是在空搜索文本上进行。此问题是否与INotifyProperty接口有关?