我有一個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控件,然後設置其視圖的位置?
這就是我錯過的。 UpdateLayout獲取ScrollIntoView(我過去一直試圖開始工作)來完成它需要的工作。謝謝! – Rob 2009-12-04 16:00:17
太棒了。我嘗試了幾種不同的方法,這個方法非常適合我的需求。 – beaudetious 2010-01-29 15:50:01