我创建了一个包含大约1500个元素的ComboBox。 这个ComboBox在第一次使用存储过程填充集合时非常慢 我该怎么办?
这是Code`
<ComboBox Name="cbMember" TextSearch.TextPath="MemberFullName" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" IsEditable="True" Height="23" VerticalAlignment="Center" Grid.Row="1" Grid.Column="1" Margin="5,0,0,0" ItemsSource="{Binding MemberCollection}" SelectedItem="{Binding Path=SelectedSearchMember,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" KeyDown="cbMember_KeyDown" DropDownClosed="cbMember_DropDownClosed" SelectionChanged="cbMember_SelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding MemberFullName}" VerticalAlignment="Center" />
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>`
并填写可观察的集合代码在这里
MemberCollection = new ObservableCollection<PROC_MembersList_Result>(_context.PROC_MembersCollectionList().Where(c => c.IsHide != null && (bool)c.IsHide == true));
答案 0 :(得分:1)
这是一个问题,知道它是否需要很长时间的远程调用,或者它是否需要一段时间来呈现所有元素的WPF(意味着虚拟化不起作用)。
首先,在构造函数中移动远程调用:
public MyViewModel()
{
Task.Factory.StartNew(() =>
{
var members = new ObservableCollection<PROC_MembersList_Result>(
_context.PROC_MembersCollectionList()
.Where(c => c.IsHide != null && (bool)c.IsHide == true));
Application.Current.Dispatcher.Invoke(new Action(() =>
{
MemberCollection = members;
}));
}
}
这样做是因为它使远程调用在一个单独的线程中,以便不冻结你的应用程序,然后它使用调度程序在UI线程上设置MemberCollection
(否则你得到一个跨线程异常)
对于第二个问题,google周围,正确的虚拟化问题可能很难解决。