在WPF窗口中绑定组合框时,我遇到了一个奇怪的问题。
我正在加载一个List对象,通过它的.ItemsSource,在Window Load上填充组合框,然而,它没有填充。
至少,直到点击箭头。单击箭头后,窗口会冻结,大约一分钟后,会显示4000多条记录。
现在,列表被加载了,但是,当我点击组合框时,它需要一段时间才能渲染,那么如何在渲染列表时显示等待标记呢?
这是Xaml:
<ComboBox Grid.Column="1"
HorizontalAlignment="Stretch" Margin="3" Name="tUser" VerticalAlignment="Stretch"
DisplayMemberPath="UsersName" SelectedValuePath="UserID" SelectedValue="0"/>
代码隐藏是:
Private Sub CreateTask_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Using New WaitCursor
_LA.Show()
Me.tOrder.ItemsSource = GetOrderList()
Me.tUser.ItemsSource = GetUserList()
_LA.Hide()
End Using
End Sub
Private Function GetUserList() As List(Of UserTyping)
Dim _Qry As New List(Of UserTyping)
Using db As New DataAccess
With db
.QueryType = CmdType.InlineSQL
.Query = "Select 0 As UserID, '-Select User-' As UsersName Union All Select userID As UserID, userFullName As UsersName From vwSelectUser"
Using _Results = .GetResults()
If _Results IsNot Nothing Then
If _Results IsNot Nothing Then
_Qry = (From row In _Results.Cast(Of DbDataRecord)()
Select New UserTyping() With {
.UserID = Common.IsNull(Of Long)(row, 0, 0),
.UsersName = Common.IsNull(Of String)(row, 1, String.Empty)
}).ToList()
Else
_Qry = New List(Of UserTyping)
End If
End If
End Using
End With
End Using
Return _Qry
_Qry.Clear()
End Function
Partial Public Class UserTyping
Public Property UserID As Long
Public Property UsersName As String
End Class
答案 0 :(得分:4)
我不确定是否有更好的方法,但是......
如果您想在第一次打开ComboBox
时想要避免等待有多件商品,可以将ComboBox.IsDropDownOpen
设为True
并返回False
编辑: 一点点的研究出现了VirtualizingStackPanel。基本上,您的XAML将如下所示:
<ComboBox>
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
我能够立即查看带有4万个数字的ComboBox
。
答案 1 :(得分:1)
您正在混淆加载渲染。在下面的示例中,get_由Window_Loaded调用,而不是通过CB上的单击调用。一旦窗口第一次显示,cb对象已经有了它的数据 - 下拉列表就不会在默认状态下呈现。就像让ComboBox预渲染那样只是没有意义,因为组合框的默认状态只是单行。将SelectedIndex指定为1,您将看到首次显示Widow时的值 - 证明组合框已有其数据。
public List<string> cbSource
{
get
{
List<string> ss = new List<string>();
for (int i = 0; i < 1000; i++)
{
ss.Add("jim_" + i.ToString());
ss.Add("mary_" + i.ToString());
ss.Add("steve" + i.ToString());
}
return ss;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
cb.ItemsSource = cbSource;
}