2014-01-27 37 views
1

在WPF DataGrid中,我試圖選擇一個給定列中的所有細胞用下面的代碼的DataGrid:添加DataGridCellInfo-實例的DataGrid.SelectedCells收集是很慢

for (int i = 0; i < MyDataGrid.Items.Count; i++) 
{ 
    MyDataGrid.SelectedCells.Add(new DataGridCellInfo(MyDataGrid.Items[i], column)); 
} 

這段代碼雖然運行非常緩慢。

MyDataGrid.Items類型ItemCollection<MyDataStructure>並擁有約70,000項。

MyDataGrid.SelectedCells的類型爲IList<DataGridCellInfo>。 它總共需要大約30秒的循環。

有人可以解釋爲什麼需要這麼久嗎? 另外,是否可以交換這個LINQ查詢?

回答

1

無論如何,訪問SelectedCells/SelectedRows/SelectedColumns對於大數據集來說都是無效的。所以你不能改變它的工作很多更好。相反,我建議你使用風格和DataTrigger。要應用此解決方案,您必須擴展MyDataStructure並添加IsSelected屬性。然後模仿選擇通過將特定風格

<Style x:Key="dataGridSelectableCellStyle" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsItemSelected}" Value="True"> 
      <Setter Property="Background" Value="Gey"/> 
      <Setter Property="Foreground" Value="White"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

物業在MyDataStructure

private bool isItemSelected; 
    public bool IsItemSelected 
    { 
     get { return isItemSelected; } 
     set 
     { 
      isItemSelected = value; 
      this.OnPropertyChanged("IsItemSelected"); 
     } 
    } 

最後通過行循環:

foreach(var item in MyDataGrid.ItemsSource.Cast<MyDataStructure>()) 
{ 
    item.IsItemSelected = true;    
} 
+0

看起來這是最好的方法對我來說,謝謝。 –

+0

我對這個解決方案有另外一個問題: 這對於選擇整個LINE非常適用,但選擇COLUMN如何?這意味着每行選擇一個「MyDataStructure」項。 –