使用wpf中的文本框搜索数据绑定列表框

时间:2012-01-08 20:31:09

标签: c# wpf xaml textbox

我有一个列表框,其中项目从一个类(contactclass)加载,我想在用户在文本框中键入任何内容时创建一个文本框,列表框应该搜索输入的起始字符并显示在列表框? 这是我的一些代码

<Window.DataContext>
    <local:AddressBookViewModel  x:Name="ViewModel"/>
</Window.DataContext>

搜索文本框

<TextBox  Name="txtNameToSearch" HorizontalAlignment="Right" Height="26" Margin="0,18,68,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="160" BorderThickness="3" Text="{Binding ___No_Name_}" TextChanged="TextBox_TextChanged">

列表框

<ListBox  IsTextSearchEnabled="True"   x:Name="___No_Name_" HorizontalAlignment="Left" Margin="37,71,0,47" Width="217" ItemsSource="{Binding Contacts, Mode=TwoWay}" SelectedItem="{Binding SelectedContact,Mode=TwoWay}" Opacity="0.495" DisplayMemberPath="Name" FontFamily="Verdana" FontWeight="Bold" >

请问有人可以告诉我接下来应该做什么吗?

1 个答案:

答案 0 :(得分:1)

我处理这个的方法是在你的viewmodel上有一些“搜索字符串”属性,你将TextBox的文本绑定到:

private _someString = string.Empty;
public SomeString
{
  get { return _someString; }
  set 
  {
     _someString = value;
     DoSearch();
  }
}

XAML:

<TextBox Text={Binding Path="SomeString", Mode=OneWayToSource}/>

您不应该需要“TextChanged”事件。

然后,在您的viewmodel上的公共属性“Set”部分中,您可以调用您创建的搜索方法,该方法将使用结果填充一些ObservableCollection。这个相同的集合将是ListBox的ItemsSource。

回顾一下:您将拥有一些您想要搜索的主数据集合。当您在文本框中键入内容时,将调用搜索方法,使用与搜索匹配的结果填充另一个集合。

我给出的解决方案只是单线程,并且会在执行搜索时锁定GUI,因此我建议将搜索推送到另一个线程。如果你这样做,你需要确保创建ObservableCollection的线程(可能是你的GUI线程)是添加结果的相同线程...这是因为你不能修改一个不同于以下线程的ObservableCollection它创建的那个。

另一种选择是探索CollectionView and it's filtering capabilities