2010-01-21 81 views
1

當用戶進行編輯時,我正在更改單元格的背景顏色。我想在保存(或恢復)更改時將所有單元格恢復爲普通顏色。在Xceed DataGrid中爲WPF循環遍歷所有單元格?

設置單元格的原始背景顏色(如存儲在父行中)很容易。但我不知道如何遍歷表中的所有單元格來重置它們。

我在Xceed知識庫中找到一篇名爲「How to iterate through the grid's rows」的文章......你認爲這將是完美的,對嗎?錯誤;文章中提到的.DataRows,.FixedHeaderRows等屬性(或方法)來自an older/defunct Xceed product

This forum thread建議使用DataGrid的.Items屬性,它在我的情況下返回System.Data.DataRowView個集合...但我找不到高達Xceed.Wpf.DataGrid.DataCell小號任何方式強制轉換(或任何相關的元素)我需要改變背景顏色。

總之,我如何循環行和單元格,以便我可以重置背景屬性?

回答

3

由於Mohamed, an Xceed employee who posted on the Xceed Forums,問題已解決。示例代碼如下:

foreach (object item in this.DataGrid1.Items) 
{ 
    Dispatcher.BeginInvoke(new Action<object>(RemoveRowHighlights), DispatcherPriority.ApplicationIdle, item); 
} 
... 
private void RemoveRowHighlights(object item) 
{ 
    Xceed.Wpf.DataGrid.DataRow row = this.DataGrid1.GetContainerFromItem(item) as Xceed.Wpf.DataGrid.DataRow; 
    if (row != null) foreach (Xceed.Wpf.DataGrid.DataCell c in row.Cells) 
    { 
     if (c != null) c.Background = row.Background; 
    } 
} 
1

我建議你改變你的業務邏輯來代替使用數據綁定。

數據網格中的每個單元格都將是一個對象,它本身知道它是否已被編輯。然後您可以將數據綁定到該屬性,因此當您保存並重置所有對象時,狀態也會在您的gui中更新。

此外,你會得到一個免費的關注分離。 You GUI現在決定應該如何看待,而不是保存/未保存的跟蹤的業務邏輯應該是什麼。

+0

我的DataGrid已經在使用數據綁定。所以是的,業務邏輯和演示已經分開了,這個問題只是關於演示的一部分。 我沒有在問題中提到,當單元格的IsDirty屬性爲true時,我已經嘗試創建單獨的樣式(本質上是「高亮」),但它不起作用。據我所知,Xceed的DataGrid for WPF只允許我爲某些屬性(例如'IsMouseOver')設置樣式觸發器,但不允許爲其他人(包括與數據相關的屬性如IsDirty)設置樣式觸發器。 – ewall 2010-04-19 17:28:16

0

推薦的方法做到這一點是通過隱式觸發器(因爲UI虛擬化),並在Xceed數據網格的所有屬性是可設置的,除了那些通過在數據網格中定義的主題強加的。

例如:

<Style TargetType="{x:Type xcdg:DataCell }"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsDirty}" 
        Value="True"> 
      <Setter Property="Background" 
        Value="DeepSkyBlue" /> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style>