2009-10-02 35 views
7

Làm cách nào để thay đổi màu của các hàng dữ liệu Silverlight ?!C# Silverlight Datagrid - Thay đổi màu của hàng

Tôi đã thử điều này, nhưng nó dường như không làm việc như thế nào tôi muốn nó ... hàng ngẫu nhiên có được màu đúng:

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

tôi không nghĩ rằng có thể hàng để có được màu ngẫu nhiên của nó với mã này - nhưng nó có thể nếu bạn không luôn luôn thiết lập một màu nền - xem câu trả lời của tôi dưới đây –

Trả lời

6

Microsoft Tài liệu:

Để cải thiện hiệu suất, tài sản EnableRowVirtualization là set là true theo mặc định. Khi thuộc tính EnableRowVirtualization là được đặt thành true, DataGrid không khởi tạo đối tượng DataGridRow cho từng mục dữ liệu trong nguồn dữ liệu bị ràng buộc. Thay vào đó, DataGrid tạo các đối tượng DataGridRow chỉ khi chúng cần thiết và tái sử dụng chúng nhiều như nó có thể. Ví dụ, DataGrid tạo đối tượng DataGridRow cho mỗi dữ liệu mục hiện đang được xem và tái chế hàng khi nó cuộn ra chế độ xem.

nguồn: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

điều này giải thích hành vi mà bạn đã trải qua

sự phù hợp (mặc dù không phải dễ dàng hơn tôi thừa nhận) giải pháp phúc, do đó, để sử dụng các sự kiện UnloadingRow để bỏ đặt phong cách bạn có bộ.

3

tôi là sau này:

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

Nếu đây làm việc cho bạn, bạn nên chấp nhận nó như là câu trả lời. – kersny

+0

Tôi không thấy cách sửa lỗi này. Trừ khi một vấn đề rõ ràng có thể được trình bày các giải pháp cho toàn bộ câu hỏi này nên được xóa. – AnthonyWJones

+0

@Kersny Không thể chấp nhận câu trả lời của riêng bạn trong 2 ngày. @AnthonyWJones, những người như bạn làm phiền tôi, lớn lên. – Goober

5

Tôi đã có cùng một vấn đề này và tìm ra nó sau khi thực hiện một bài kiểm tra tối thiểu và một số lý luận suy luận!

Về cơ bản các giải pháp là LUÔN chắc chắn rằng bạn thiết lập màu nền (hoặc bất kỳ phong cách trên thực tế). Đừng thừa nhận bất kỳ giá trị mặc định nào cho kiểu dáng hàng. Tôi giả định mặc định là màu trắng - là một giả định hợp lý nhưng thực ra không phải như vậy.

Thông tin chi tiết:

Dường như thời gian chạy reuses thể hiện của lớp Row khi vẽ nhiều hàng. Tôi đã không xác minh điều này ở tất cả, nhưng đánh giá từ các triệu chứng có vẻ như điều đó phải xảy ra.

Tôi chỉ có một hoặc hai hàng nên được tô màu khác nhau. Tôi đã nhìn thấy các hàng màu ngẫu nhiên khi cuộn lên và xuống.

Đây là lớp thử nghiệm mà tôi đã thực hiện. Mỗi hàng thứ năm được cho là màu đỏ và nghiêng.

Bạn sẽ thấy một vài dòng được nhận xét (thiết lập mặc định là nền không nghiêng và trắng). Với những nhận xét ra - nếu bạn di chuyển lên và xuống bạn sẽ thấy rất nhiều màu đỏ !! Điều này là do các đối tượng hàng đang được sử dụng lại. Nếu bạn làm cho cửa sổ nhỏ hơn và sau đó tối đa hóa nó một số màu trắng sẽ trở lại. Có lẽ thu gom rác thu thập hàng nó không nghĩ rằng bạn sẽ cần bất kỳ chi tiết sau khi đã làm cho cửa sổ nhỏ hơn.

Như tôi đã nói ở trên, giải pháp là luôn luôn chỉ định kiểu cho mặc định và không giả định bất kỳ giá trị mặc định nào.

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

Cách tốt nhất để làm điều này là thay đổi RowStyle trên DataGrid của bạn. Điều này đòi hỏi rất nhiều xaml, nhưng bạn chỉ có thể sao chép từ here và thay đổi một vài kiểu trong đó.

Ngoài ra, nếu bạn cần thay đổi màu hàng dựa trên dữ liệu hàng, bạn có thể thêm một ràng buộc trong thuộc tính Kiểu để bàn chải trên dữ liệu của mình.

Họ đã mở Reflector và lấy generic.xaml cho DataGrid từ System.Windows.Controls.Data.dll, sau đó viết một số xaml mới để thay đổi nó.

0

Nó phù hợp với tôi. =)

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; 
     } 
    } 
Các vấn đề liên quan