3

我对 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);
    }
}

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

4

0 回答 0