2

我创建了一个包含大约 1500 个元素的 ComboBox。这个 ComboBox 第一次非常慢,甚至用存储过程填充集合我该怎么办?

这是代码`

<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));
4

1 回答 1

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;
       }));
    }
}

它的作用是在单独的线程中进行远程调用,以免冻结您的应用程序,然后它使用调度程序MemberCollection在 UI 线程上进行设置(否则您会收到跨线程异常)。

对于第二个问题,google 一下,正确的虚拟化问题可能很难解决。

于 2012-11-23T09:33:34.450 回答