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