2012-03-06 11 views
1

私のwpfウィンドウには2つのリストボックスがあります。 1つは使用可能なアイテム用であり、もう1つは選択されたアイテム用です。利用可能なアイテムは通常、フィルタリングされていないと3000以上のアイテムを保持します。ユーザーには、アイテムタイプをフィルタリングするためのコンボボックスとアイテム名をフィルタリングするテキストボックスが表示されます。現在、私はLinqを使って項目をフィルタリングしていますが、リストを非常にゆっくりとリフレッシュしています。私はもっ​​と良いアプローチがあるのだろうかと思っています。ViewModelでコレクションにバインドされたリストボックスを素早く効率的にフィルタリングする

いくつかの注意点:私は、選択された項目( 's'の点に注意)プロパティをビューモデルにバインドするための動作を作成しました。この動作には、動作するためにコレクション型が必要です。 変更されたときにプロパティを更新するようにテキストフィルタを設定しました。プロパティメソッドでフィルタメソッドを呼び出しました。

ビュー:

<DatePicker Grid.Row="0" Grid.Column="1" Height="26" VerticalAlignment="Center" SelectedDate="{Binding FromDate}" /> 
<DatePicker Grid.Row="0" Grid.Column="3" Height="26" VerticalAlignment="Center" SelectedDate="{Binding ToDate}" /> 
<ComboBox Grid.Row="1" Grid.Column="1" Height="22" VerticalAlignment="Center" ItemsSource="{Binding Classes}" SelectedItem="{Binding SelectedClass}" /> 
<TextBox Grid.Row="4" Grid.Column="1" Height="22" VerticalAlignment="Center" Text="{Binding CiNameFilterText, UpdateSourceTrigger=PropertyChanged}" Margin="55,0,0,178" /> 
<ListBox Grid.Row="4" Grid.Column="1" Height="172" ItemsSource="{Binding AvailableCis}" DisplayMemberPath="CiName" SelectionMode="Extended" Ocean_WPF:ListBoxBehavior.SelectedItems="{Binding AvailableCisSelected}" Margin="0,28,0,0" /> 
<ListBox Grid.Row="4" Grid.Column="3" Height="200" ItemsSource="{Binding SelectedCis}" DisplayMemberPath="CiName" SelectionMode="Extended" Ocean_WPF:ListBoxBehavior.SelectedItems="{Binding SelectedCisSelected}" /> 

のViewModel:

Protected Sub FilterCiList() 
    Try 
     If (_caCiData IsNot Nothing) Then 
      If ((_selectedClass IsNot Nothing AndAlso Not _selectedClass.Equals(String.Empty)) AndAlso (_ciNameFilterText IsNot Nothing AndAlso Not _ciNameFilterText.Equals(String.Empty))) Then 
       Me.AvailableCis = New ObservableCollection(Of CA.SoftwareRow)(_caCiData.Where(Function(ci) ci.Class.ToUpper.Equals(_selectedClass.ToUpper) AndAlso ci.CiName.ToUpper.Contains(_ciNameFilterText.ToUpper)).OrderBy(Function(a) a.CiName)) 
      ElseIf ((_selectedClass IsNot Nothing AndAlso Not _selectedClass.Equals(String.Empty)) AndAlso (_ciNameFilterText Is Nothing OrElse _ciNameFilterText.Equals(String.Empty))) Then 
       Me.AvailableCis = New ObservableCollection(Of CA.SoftwareRow)(_caCiData.Where(Function(ci) ci.Class.ToUpper.Equals(_selectedClass.ToUpper)).OrderBy(Function(a) a.CiName)) 
      ElseIf ((_selectedClass Is Nothing OrElse _selectedClass.Equals(String.Empty)) AndAlso (_ciNameFilterText IsNot Nothing AndAlso Not _ciNameFilterText.Equals(String.Empty))) Then 
       Me.AvailableCis = New ObservableCollection(Of CA.SoftwareRow)(_caCiData.Where(Function(ci) ci.CiName.ToUpper.Contains(_ciNameFilterText.ToUpper)).OrderBy(Function(a) a.CiName)) 
      Else 
       Me.AvailableCis = New ObservableCollection(Of CA.SoftwareRow)(_caCiData.OrderBy(Function(a) a.CiName)) 
      End If 

      If (Me.SelectedCis IsNot Nothing) Then 
       For Each Ci In Me.SelectedCis 
        Me.AvailableCis.Remove(Ci) 
       Next 
      End If 
     End If 
    Catch ex As Exception 
     _viewModelUIService.ExceptionDialog(ex) 
    End Try 
End Sub 

_caCiDataがいっぱいフィルタリングされていないリストです。リストをフィルタリングすると、フィルタに一致する項目だけを表示する必要があるので、Linqクエリを使用してこれらの項目をAvailableCisプロパティに追加するだけです。

そこフィルタリングが遅いとしてこれを行うには良い方法であること(それはビューでリストを更新することができます前に約5秒かかります)

編集しなければなりません

:私の友人は、データビューを提案し、これをだろう毎回コレクション全体をフィルタリングするよりも効果的ですか?

答えて

0

私はこれを考え出しました。 Dataviewを提案した同じ友達は、WPFにバグがあり、あまりにも多くのアイテムを読み込んでいることを思い出しました。これは本当にUIを低下させました。リストボックスをDatagridに変更し、リストボックスのようにスタイルを設定しました。結果は夜と日でした。私は今、私が望むスピードを持っています。

関連する問題