良好的DataGrid过滤性能的最佳实践?

时间:2013-08-12 15:58:53

标签: c# wpf data-binding datagrid filter

我是C#和WPF的新手,我正在开发一个相当简单的程序,在DataGrid中列出~650个对象,并使用TextBox的内容过滤掉不包含该字符串的项目在一个特定的领域。

然而,过滤和DataGrid的性能非常糟糕。在输入搜索字符串时,应用程序再次响应时间最多需要几秒钟,甚至滚动表格中的项目列表也很慢而且很粗糙。

我尝试使用回收模式在桌面上启用虚拟化,但它似乎根本不会影响性能。

对于WPF,数据绑定/过滤通常这么慢吗?是否有最佳实践来决定何时在WPF中使用数据绑定以及何时更新代码隐藏中的内容?

以下是我用于此程序的大部分代码:

<TextBox x:Name="SearchBox" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch"
         Text="{Binding SearchText, Mode=TwoWay}" TextChanged="TextBox_TextChanged" />
<DataGrid x:Name="ItemGrid" Grid.Row="2" Grid.Column="0"
          HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
          ItemsSource="{Binding VariableList}" AutoGenerateColumns="False"
          CanUserAddRows="False" CanUserDeleteRows="False"
          VirtualizingStackPanel.VirtualizationMode="Recycling"
          VirtualizingStackPanel.IsVirtualizing="True">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding DisplayName}" IsReadOnly="True">                    
    </DataGridTextColumn> 
</DataGrid.Columns>
</DataGrid>

代码隐藏:

private bool FilterVariables(object obj)
{
    DataGridItem = obj as DataGridItem;
    if (item == null) return false;

    string textFilter = SearchBox.Text;
    if (textFilter.Trim().Length == 0) return true; // the filter is empty - pass all items

    // apply the filter
    if (item.DisplayName.ToLower().Contains(textFilter.ToLower())) return true;
    return false;
}

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // Get the default view from the listview
    ICollectionView view = CollectionViewSource.GetDefaultView(ItemGrid.ItemsSource);
    if (view != null)
    {
        view.Filter = null;
        view.Filter = new Predicate<object>(FilterVariables);
    }
}

修改 修改了我的一些初始代码(未发布)并删除了我的一些代码隐藏中对单例的引用后,性能得到了显着提升。不幸的是,如果其他人遇到类似的问题,我没有明确的解决方案,但我怀疑我的问题要么与单身人员的使用有关,要么与我的编码混乱有关。

0 个答案:

没有答案