2012-04-07 4 views
6

ObserverableCollection으로 채워진 WPF DataGrid가 있습니다.WPF Datagrid 행 색상 변경

이제 프로그램 시작시 및 런타임 중에 변경된 행 내용에 따라 행의 색을 지정하려고합니다.

System.Windows.Controls.DataGrid areaDataGrid = ...; 
ObservableCollection<Area> areas; 
//adding items to areas collection 
areaDataGrid.ItemsSource = areas; 

areaDataGrid.Rows <-- Property not available. how to access rows here? 

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(areaDataGrid.Items); 
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(areaDataGrid_Changed); 
... 

void areaDataGrid_Changed(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //how to access changed row here? 
} 

어떻게 시작 및 런타임에 행에 액세스합니까?

답변

11

RowStyle을 사용하십시오. Triggers을 사용하여 색상을 조건부로 변경하거나 항목의 Brush 속성에 바인딩하고 속성을 각각 변경할 수 있습니다.

5

트리거 대신 코드를 통해 변경하려면 다음과 같이 표시 할 수 있습니다. 데이터를 배열로 액세스 한 다음 비교할 수 있습니다. 이 예제에서는 4 번째 열을 0보다 큰지 비교하고 5 번째 열이 0보다 작은 지 확인합니다. 그렇지 않으면 기본 색으로 칠합니다. try/catch는 일부 논리가 유효한 행인지 아닌지 확인하기 위해 추가해야하기 때문에 ..... 또는 아래의 오류를 무시할 수 있지만 사용 가능한 상태로 유지해야합니다. .

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     try 
     { 
      if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[3].ToString()) > 0) 
      { 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      } 
      else if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[4].ToString()) < 0) 
      { 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
      } 
      else 
      { 
       e.Row.Background = new SolidColorBrush(Colors.WhiteSmoke); 
      } 
     } 
     catch 
     { 
     } 
    }