2012-11-23 55 views
2

我創建了一個包含大約1500個元素的組合框。 這個ComboBox在第一時間很慢,甚至用存儲過程填充集合 我該怎麼辦?與WPF中的許多元素的組合框性能

這裏有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

它知道,如果它是遠程調用,需要長時間的問題,或者如果它是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(否則您會遇到交叉線程異常)。

對於第二個問題,谷歌周圍,正確的虛擬化問題可能會很難解決。