2009-10-02 7 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

이 코드와 그것의 가능한 무작위 색깔하려면 행을 생각하지 않는다 -하지만 당신은 항상 배경색을 설정하지 않은 경우 가능 -이 당신을 위해 작동하는 경우 –

답변

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

+0

어떻게 해결되는지 모르겠다. 분명한 문제가 제시되지 않는 한,이 전체적인 질문에 대한 해결책은 삭제되어야한다. – AnthonyWJones

+0

@Kersny 2 일 동안 나만의 답변을 수락 할 수 없습니다. @AnthonyWJones, 당신 같은 사람들이 나를 괴롭히며 자랍니다. – Goober

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에서 그것을 복사하고 그 안에 몇 가지 스타일을 바꿀 수 있습니다.

또한 행 데이터를 기반으로 행 색상을 변경해야하는 경우 데이터의 스타일을 브러시 속성에 추가 할 수 있습니다.

그들은 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; 
     } 
    }