2009-12-03 25 views
4

我有一個silverlight列表框用作搜索結果框。我正在使用動態搜索(搜索框中的按鍵導致事件觸發以過濾此列表框的內容)。我遇到的問題是,如果用戶在未過濾盒子時向下滾動,那麼搜索,列表框的重新綁定不會導致滾動返回到頂部,使得結果看起來像只有一個它的價值。重新綁定Silverlight Listbox控件後,如何讓列表框滾動到頂部?

代碼我到目前爲止用於列表框是該(這是一個簡化的版本):

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 

再次,這大大簡化從正在發生的事情(我去數據庫獲取報告名稱等)。當我重新綁定列表框時,如何讓它滾動至列表頂部的第一個項目?由於我無法從ListBox對象中訪問scrollviewer控件,因此我是否必須創建一個圍繞列表框的scrollviewer控件,然後設置其視圖的位置?

回答

6

在看這篇文章

Automatic Scrolling in a Silverlight List Box

後,我嘗試了以下,它爲我工作得很好。

theListBox.ItemsSource = data; 
theListBox.UpdateLayout(); 
theListBox.ScrollIntoView(theListBox.Items[0]); 
+0

這就是我錯過的。 UpdateLayout獲取ScrollIntoView(我過去一直試圖開始工作)來完成它需要的工作。謝謝! – Rob 2009-12-04 16:00:17

+0

太棒了。我嘗試了幾種不同的方法,這個方法非常適合我的需求。 – beaudetious 2010-01-29 15:50:01

0

,您是否試圖

mReportList.SelectedIndex = 0 
+0

我想這樣做,與SearchResultBox並沒有任何反應,它仍然只在與盒的最底部滾動條框的頂部的最後一個值滾動。當我嘗試執行mReportList.SelectedIndex時,它不是mReportList的有效屬性。 – Rob 2009-12-03 21:55:50

相關問題