WPF DataGrid隐藏行条件导致应用程序无响应

时间:2015-10-13 16:17:52

标签: c# wpf datagrid async-await

我有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;
    }
}

问题是方法UpdateShowAllDataGrid.RowStyle更新之前很久就完成了。处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如此大规模地执行ShowCollapse非常耗费资源。在后端完成所有数据处理会更好。您可能希望将商品绑定到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);

}