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