2009-10-02 54 views
7

如何更改silverlight datagrid行的顏色?!C#Silverlight Datagrid - 行顏色變化

我已經試過這一點,但它似乎沒有工作,我怎麼想它...隨機行會塗有顏色不正確:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      var c = e.Row.DataContext as Job; 
      if (c != null && c.Status.Contains("complete")) 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
     } 
+0

我不認爲它可能得到隨機有色行與此代碼 - 但它是可能的,如果你不總是設置背景顏色 - 見下文 – 2010-01-17 03:05:06

回答

6

微軟文檔:

爲了提高性能,EnableRowVirtualization屬性是 設置爲true默認情況下。當EnableRowVirtualization屬性爲 設置爲true時,DataGrid不會爲綁定數據源中的每個數據項實例化一個DataGridRow對象 。相反,DataGrid僅在需要時才創建DataGridRow對象,並且可以重複使用它們。例如,DataGrid爲當前正在查看的每個數據 項創建一個DataGridRow對象,並在滾動顯示 的視圖時重新循環該行。

來源:http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

這說明你已經經歷

的行爲的合理(雖然不容易,我承認)溶液中,因此,使用UnloadingRow事件來取消你有風格組。

3

我是在這之後:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      DataGridRow row = e.Row; 
      var c = row.DataContext as Job;   
      if (c != null && c.Status.Contains("omplete")) 
       e.Row.Foreground = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Foreground = new SolidColorBrush(Colors.Red); 
     } 
+0

我的回答如果這對你的作品,你應該接受它作爲答案。 – kersny 2009-10-02 14:41:22

+0

我不明白這是如何解決的。除非能夠提出明確的問題,否則應該刪除給出整個問題的解決方案。 – AnthonyWJones 2009-10-02 14:53:24

+0

@Kersny不能接受你自己的答案2天。 @AnthonyW瓊斯,像你這樣的人煩我,長大。 – Goober 2009-10-02 15:58:53

5

我做了一個最小的測試和一些演繹推理之後,我也遇到了同樣的問題,並想出了它。

基本上解決的辦法是總是 確保你設置背景顏色(或事實上任何風格)。 不要假設行造型的任何默認設置。我假設 默認爲白色 - 這是合理的假設,但實際上並非如此。

更多細節:

它看起來像運行時呈現多行的時候重用行類的實例。我根本沒有證實這一點,但從看起來似乎必然會發生的症狀來看。

我只有一行或兩行應該有不同的顏色。滾動上下滾動時,我看到隨機彩色的行。

這是我做的測試班。每五行應該是紅色和斜體。

您會看到一條註釋掉的行(它設置了非斜體和白色背景的默認值)。有了這些評論 - 如果你上下滾動,你會看到很多紅色!這是因爲行對象正在被重用。如果你讓窗口變小然後最大化一些白色會回來。可能垃圾收集器收集行,它不認爲你需要更多的窗口後,需要更多。

正如我上面所說的,解決方案是總是指定默認樣式,不要假設任何默認值。

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person() 
     { 
      FirstName = "John", 
      LastName = "Smith", 
      ID = x, 
      Delinquent = (x % 5 == 0)  // every fifth person is 'delinquent' 
     }); 
    } 

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var person = (Person)e.Row.DataContext; 

     if (person.Delinquent) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      // e.Row.Background = new SolidColorBrush(Colors.Green); 
      // e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      // e.Row.FontStyle = FontStyles.Normal; 
     } 

    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int ID { get; set; } 
     public bool Delinquent { get; set; } 
    } 
} 
0

這樣做的最好方法是更改​​DataGrid上的RowStyle。這需要大量的xaml,但您可以從here中複製它並在其中更改一些樣式。另外,如果您需要根據行數據更改行顏色,則可以將樣式中的綁定添加到數據的Brush屬性中。

他們打開Reflector,從System.Windows.Controls.Data.dll取得DataGrid的generic.xaml,然後編寫一些新的xaml來改變它。

0

它適合我。 =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var row = e.Row.GetIndex(); 
     if (row % 2 == 0) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      e.Row.Background = new SolidColorBrush(Colors.Green); 
      e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      e.Row.FontStyle = FontStyles.Normal; 
     } 
    }