2012-04-07 25 views
6

ObserverableCollectionで埋められたWPFデータグリッドがあります。WPF Datagrid Row Colorを変更します。

ここでは、プログラムの開始時および実行時に何かが変化した場合に、行の内容に応じて行を色付けしたいと考えています。

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より小さいかどうかを確認しています。そうでない場合はデフォルトの色に塗りつぶします。それは有効な行かどうかを確認するために追加する必要があるいくつかのロジックを必要とするので試して/それをキャッチ.....またはあなたは単に以下のようにエラーを無視することができますが(実際には良い練習ではありませんが) 。

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 
     { 
     } 
    } 
関連する問題