我有一个列表框,其中项目从一个类(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" >
请问有人可以告诉我接下来应该做什么吗?
答案 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它创建的那个。