I have a Silverlight list that is used as a search results window. I use dynamic search (keyups in the search box cause events to light up to filter the contents of this list). The problem I am facing is that the user scrolls when the field is not filtered, and then searching, renaming the list does not cause the scrolling to return to the beginning, as a result of which the results look like a single value in it.
the code that I still have for the list is this (this is a simplified version):
XAML:
<Grid x:Name="MainGrid" Rows="2"> <StackPanel Orientation="Horizontal" Grid.Row="0"> <TextBlock text="Search" Grid.Row="0" /> <Textbox x:name="textboxSearch" Keyup="textBoxSearch_KeyUp" width="200" Height="25"/> </StackPanel> <ListBox x:Name="SearchResultBox" Visibility="Visible" Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalscrollbarVisibility="Auto"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding ReportName}" /> <TextBlock Text="{Binding ReportDescription}" /> </StackPanel> </DataTemplate> </Listbox.ItemTemplate> </ListBox> </Grid>
VB:
Imports System.Threading Imports System.Collections.ObjectModel Imports System.ComponentModel Partial Public Class ucSearch Inherits UserControl Private WithEvents BGwork As New BackgroundWorker() Private mReportList as New List(Of cFilter) Public Sub New() InitializeComponent() FillReportList() NewFilterList() End Sub Private Sub FillReportList() mReportList.Add(new cFilter("Report A", "Report A desc") mReportList.Add(new cFilter("Report B", "Report B desc") mReportList.Add(new cFilter("Report C", "Report C desc") mReportList.Add(new cFilter("Report D", "Report D desc") mReportList.Add(new cFilter("Report E", "Report E desc") mReportList.Add(new cFilter("Report F", "Report F desc") mReportList.Add(new cFilter("Report G", "Report G desc") mReportList.Add(new cFilter("Report H", "Report H desc") mReportList.Add(new cFilter("Report I", "Report I desc") mReportList.Add(new cFilter("Report J", "Report J desc") mReportList.Add(new cFilter("Report K", "Report K desc") mReportList.Add(new cFilter("Report L", "Report L desc") mReportList.Add(new cFilter("Report M", "Report M desc") End Sub Private Sub textboxSearch_KeyUp(ByVal sender as System.Object, _ ByVal e as System.Windows.Input.KeyeventArgs) NewFilterList() End Sub Private Sub NewFilterList() If BGwork.IsBusy Then If Not BGWork.cancellationPending Then BGwork.CancelAsync() Exit Sub End If With BGwork .WorkerSupportsCancellation = True .RunWorkerAsync(textboxSearch.Text) End With End Sub Private Sub BGwork_DoWork(ByVal sender as Object, _ ByVal e as System.ComponentModel.DoWorkEventArgs) _ Handles BGwork.DoWork Dim Filtered as New List(of cFilter) If textboxSearch.Text.Length > 0 dim q = FROM ri In mReportList Where ri.Reportname.ToLower.contains(textboxSearch.Text.ToLower) Select ri Filtered = q Else Filtered = mReportList End If Dim RTN as List(Of cFilter) = Filtered e.Cancel = False e.Result = RTN End Sub Private Sub BGwork_RunWorkerCompleted(ByVal sender As Object_ ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _ Handles BGwork.RunWorkerCompleted If e.Cancelled Then NewFilterList() Exit Sub End If Dim RTN as cFilter = TryCast(e.Result, cFilter) If IsNothing(RTN) Then Exit Sub SearchResultBox.ItemsSource = RTN SearchResultBox.InvalidateArrange() End Sub End Class Public Class cFilter Inherits BaseDataClass Private mReportName as String = "" Private mReportDescription as String = "" Public Sub New() mReportName = "" mReportDescription = "" End Sub Public Sub New(ByVal reportName as String, ByVal reportDescription as String) mReportName = reportName mReportDescription = reportDescription End Sub Public Property ReportName() as String Get Return mReportName End Get Set(ByVal value as String) mReportName = value End Set End Property Public Property ReportDescription() as String Get Return mReportDescription End Get Set(ByVal value as String) mReportDescription = value End Set End Property End Class
Again, this is greatly simplified by what happens (I go to the database to get report names, etc.). When I double-check the list, how do I get it to scroll all the way to have the first item at the top of the list? Since I do not have access to the scrollviewer control from the ListBox, do I need to create a scrollviewer control that surrounds the list and then set where it is?
source share