Поисковик Silverlight - PullRequest
       32

Поисковик Silverlight

0 голосов
/ 27 июля 2011

Я пытаюсь сделать что-то похожее на поисковик в Windows Phone 7, и я сделал следующее: у меня есть TextBox с событием 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 просто возвращает ноль ListBoxItems ...

Есть идеи?

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

если указать фильтр элементы в списке, тогда используйте 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;
}

проблема с ItemContainer заключается в том, что они создаются толькокогда элемент должен быть показан, поэтому у вас есть нулевое значение.

0 голосов
/ 27 июля 2011

Почему вы не используете привязку данных цвета?Это должен быть более простой способ.

<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++;
  }
 }
...