.net 银光搜索器
我正在尝试做一些类似于WindowsPhone7中的搜索程序的事情,我做了如下工作,我得到了一个带有TextChanged事件的文本框和一个HyperlinkButtons列表框。我尝试的是:.net 银光搜索器,.net,silverlight,null,itemcontainergenerator,listboxitems,.net,Silverlight,Null,Itemcontainergenerator,Listboxitems,我正在尝试做一些类似于WindowsPhone7中的搜索程序的事情,我做了如下工作,我得到了一个带有TextChanged事件的文本框和一个HyperlinkButtons列表框。我尝试的是: private void searchFriend_TextChanged(object sender, TextChangedEventArgs e) { int index = 0; foreach (Person person in lbFriends.Items) { List
private void searchFriend_TextChanged(object sender, TextChangedEventArgs e)
{
int index = 0;
foreach (Person person in lbFriends.Items)
{
ListBoxItem lbi = lbFriends.ItemContainerGenerator.ContainerFromItem(index) as ListBoxItem;
lbi.Visibility = Visibility.Visible;
if (!person.fullName.Contains((sender as TextBox).Text))
{
lbi.Background = new SolidColorBrush(Colors.Black);
}
index++;
}
}
下面是xaml:
<TextBox x:Name="searchFriend" TextChanged="searchFriend_TextChanged" />
<ListBox x:Name="lbFriends" Height="535" Margin="0,0,0,20">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<HyperlinkButton x:Name="{Binding id}" Content="{Binding fullName}" FontSize="24" Click="NavigateToFriend_Click" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这里的问题是当我有68个或更多的元素时,ContainerFromItem只返回null ListBoxItems
有什么想法吗
谢谢大家为什么不使用彩色数据绑定?这应该是一种更简单的方法
<HyperlinkButton x:Name="{Binding id}" Content="{Binding fullName}" Background="{Binding BackgroundColor}" FontSize="24" Click="NavigateToFriend_Click" />
private SolidColorBrush _backgroundColor;
public SolidColorBrush BackgroundColor{
get {
return _backgroundColor;
}
set { _backgroundColor= value; }
}
private void searchFriend_TextChanged(object sender, TextChangedEventArgs e)
{
int index = 0;
foreach (Person person in lbFriends.Items)
{
if (!person.fullName.Contains((sender as TextBox).Text))
{
person.BackgroundColor= new SolidColorBrush(Colors.Black);
}
index++;
}
}
私有SolidColorBrush_背景色;
公共SolidColorBrush背景色{
得到{
返回背景色;
}
设置{u backgroundColor=value;}
}
私有void searchFriend_TextChanged(对象发送者,textchangedventargs e)
{
int指数=0;
foreach(lbFriends.Items中的个人)
{
如果(!person.fullName.Contains((发件人为TextBox.Text))
{
person.BackgroundColor=新的SolidColorBrush(Colors.Black);
}
索引++;
}
}
如果要过滤列表框中的元素,请使用CollectionViewSource:
System.Windows.Data.CollectionViewSource cvs;
private void SetSource(IEnumerable<string> source)
{
cvs = new System.Windows.Data.CollectionViewSource();
cvs.Source=source;
listBox1.ItemsSource = cvs.View;
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var box = (TextBox)sender;
if (!string.IsNullOrEmpty(box.Text))
cvs.View.Filter = o => ((string)o).Contains(box.Text);
else
cvs.View.Filter = null;
}
System.Windows.Data.CollectionViewSource cvs;
私有void集合源(IEnumerable源)
{
cvs=新的System.Windows.Data.CollectionViewSource();
cvs.Source=源;
listBox1.ItemsSource=cvs.View;
}
私有void TextBox\u TextChanged(对象发送者,textchangedventargs e)
{
变量框=(文本框)发送方;
如果(!string.IsNullOrEmpty(box.Text))
cvs.View.Filter=o=>((字符串)o).Contains(box.Text);
其他的
cvs.View.Filter=null;
}
使用ItemContainer的问题是,它们仅在必须显示项时创建,这就是为什么您有一个空值。如果只有少量项,这很好,但这不是我想要的效果,例如,我希望在键入“a”时,我的400个候选项列表减少到250个