私の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秒かかります)編集しなければなりません
:私の友人は、データビューを提案し、これをだろう毎回コレクション全体をフィルタリングするよりも効果的ですか?