Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 快速高效地筛选绑定到ViewModel中集合的列表框_Linq_Mvvm_Filtering - Fatal编程技术网

Linq 快速高效地筛选绑定到ViewModel中集合的列表框

Linq 快速高效地筛选绑定到ViewModel中集合的列表框,linq,mvvm,filtering,Linq,Mvvm,Filtering,在我的wpf窗口中,我有两个列表框。一个用于可用项目,另一个用于所选项目。未过滤时,可用项目通常可容纳3000多个项目。用户将看到一个用于过滤项目类型的组合框和一个用于过滤项目名称的文本框。目前我正在使用Linq过滤项目,但它刷新列表的速度非常慢。我想知道是否有更好的方法 一些有趣的注意事项:我创建了一个附加行为,允许我将selecteditems(注意“s”)属性绑定到viewmodel,此行为需要集合类型才能工作。 我将文本过滤器设置为在更改时更新属性,并在属性设置器中调用过滤器方法 视图:

在我的wpf窗口中,我有两个列表框。一个用于可用项目,另一个用于所选项目。未过滤时,可用项目通常可容纳3000多个项目。用户将看到一个用于过滤项目类型的组合框和一个用于过滤项目名称的文本框。目前我正在使用Linq过滤项目,但它刷新列表的速度非常慢。我想知道是否有更好的方法

一些有趣的注意事项:我创建了一个附加行为,允许我将selecteditems(注意“s”)属性绑定到viewmodel,此行为需要集合类型才能工作。 我将文本过滤器设置为在更改时更新属性,并在属性设置器中调用过滤器方法

视图:

_caCiData是完整的未过滤列表。如果我过滤列表,我需要只显示与过滤器匹配的项目,因此我只需使用Linq查询将这些项目添加到AvailableCis属性

必须有更好的方法才能做到这一点,因为过滤速度很慢(需要大约5秒钟才能刷新视图中的列表)


编辑:我的一位朋友建议使用dataview,这样会比每次都过滤整个收藏效果更好吗?

我已经想出了这个办法。建议使用Dataview的同一位朋友刚刚记得WPF有一个bug,并且加载了太多的项目。这确实减慢了用户界面的速度。我将列表框更改为Datagrids,并将其样式设置为类似于列表框。结果是日以继夜。我现在有了我想要的速度

<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}" />
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