Combobox性能与WPF中的许多元素

时间:2012-11-23 09:12:09

标签: wpf combobox

我创建了一个包含大约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));

1 个答案:

答案 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周围,正确的虚拟化问题可能很难解决。