.net 银光搜索器

.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

我正在尝试做一些类似于WindowsPhone7中的搜索程序的事情,我做了如下工作,我得到了一个带有TextChanged事件的文本框和一个HyperlinkButtons列表框。我尝试的是:

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个