我有DataGrid
绑定到ObservableCollection
。根据条件,应隐藏任何给定的行。这可以由用户打开或关闭。问题是,当DataGrid中存在大量行时,隐藏和取消隐藏行可能会使应用程序在一段时间内无响应。
我正在使用DataGrid.RowStyle
这样隐藏/取消隐藏;
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ShowRow}" Value="1">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
为了便于举例,我们假设有一个开关可以将ObservableCollection
ShowRow
中的所有行从0更改为1,就像这样;
private async void Switch_Checked(object sender, RoutedEventArgs e)
{
foreach (var x in MyCollection)
{
x.ShowAll = 0;
}
}
private async void Switch_UnChecked(object sender, RoutedEventArgs e)
{
foreach (var x in MyCollection)
{
x.ShowAll = 1;
}
}
这适用于少量更改的行。但是,如果存在大量行(例如1,000个以上),则应用程序将无响应。想象我可以用这样的await
命令来解决这个问题;
private async void Switch_Checked(object sender, RoutedEventArgs e)
{
var upd = Task.Run(() => UpdateShowAll());
await upd;
}
private async void UpdateShowAll(object sender, RoutedEventArgs e)
{
foreach (var x in MyCollection)
{
x.ShowAll = 0;
}
}
问题是方法UpdateShowAll
在DataGrid.RowStyle
更新之前很久就完成了。处理这个问题的最佳方法是什么?
答案 0 :(得分:1)
如此大规模地执行Show
和Collapse
非常耗费资源。在后端完成所有数据处理会更好。您可能希望将商品绑定到ICollectionView
并相应地过滤它们。
using System.ComponentModel;
private ICollectionView cvs { get; set; }
public MyControl()
{
InitializeComponent();
cvs = CollectionViewSource.GetDefaultView(MyCollection);
MyDataGrid.ItemsSource = cvs;
cvs.Filter = FilterOut;
}
private bool FilterOut(object input)
{
MyCollectionObject obj = (input as MyCollectionObject);
return (obj.ShowAll == 1);
}