2015-10-13 96 views
1

我有一個DataGrid綁定到ObservableCollection。基於條件,任何給定的行應該被隱藏。這可以由用戶打開或關閉。問題是,當DataGrid隱藏行中有大量行時,並且取消隱藏行可能會使應用程序一段時間無響應。WPF DataGrid Hide條件導致應用程序無響應

我正在做這樣的隱藏/隱藏與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> 

爲了便於例如讓說有一個改變在ObservableCollectionShowRow從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以上),則應用程序變得無法響應。形象我可以用這樣的命令解決這個問題;

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被更新了。處理這個問題的最好方法是什麼?

回答

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); 

}