После повторного связывания элемента управления Silverlight Listbox, как получить список, чтобы перейти к началу? - PullRequest
4 голосов
/ 04 декабря 2009

У меня есть список серебряного света, который используется в качестве окна результатов поиска. Я использую динамический поиск (вызовы в окне поиска вызывают события, чтобы отфильтровать содержимое этого списка). Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь прокручивает страницу вниз, когда поле не отфильтровано, то выполняет поиск, перепривязка списка не приводит к тому, что прокрутка возвращается наверх, и результаты выглядят так, как будто есть только значение в нем.

код, который у меня есть для списка, следующий (это упрощенная версия):

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

Опять же, это значительно упрощается из того, что происходит (я захожу в базу данных, чтобы получить имена отчетов и т. Д.). Когда я перепривязываю список, как мне заставить его прокручиваться полностью, чтобы первый элемент находился вверху списка? Поскольку у меня нет доступа к элементу управления scrollviewer из объекта ListBox, нужно ли мне создавать элемент управления scrollviewer, который окружает список, а затем указывать, откуда он виден?

Ответы [ 2 ]

6 голосов
/ 04 декабря 2009

Посмотрев на этот пост

Автоматическая прокрутка в окне списка Silverlight

Я попробовал следующее, и у меня все заработало.

 theListBox.ItemsSource = data;
 theListBox.UpdateLayout();
 theListBox.ScrollIntoView(theListBox.Items[0]);
0 голосов
/ 04 декабря 2009

ты пробовал

mReportList.SelectedIndex = 0
...