2012-04-07 72 views
6

Tôi có một DataGrid WPF được điền bằng một ObserverableCollection.Thay đổi Màu dữ liệu Dòng dữ liệu WPF

Bây giờ tôi muốn tô màu các hàng tùy thuộc vào nội dung hàng tại thời điểm bắt đầu chương trình và nếu có điều gì đó thay đổi trong thời gian chạy.

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? 
} 

Tôi làm cách nào để truy cập vào các hàng khi bắt đầu và thời gian chạy?

Trả lời

11

Sử dụng RowStyle. Bạn có thể sử dụng các Triggers để thay đổi màu sắc có điều kiện, hoặc chỉ cần ràng buộc nó vào một tài sản Brush trên các mục của bạn và thay đổi tài sản đó tương ứng.

5

Để thay đổi mã thông qua mã thay vì kích hoạt, nó có thể trông giống như dưới đây. Bạn có thể truy cập dữ liệu dưới dạng mảng và sau đó so sánh nó. Trong ví dụ này, tôi đang so sánh cột thứ 4 để xem nó có lớn hơn 0 và cột thứ 5 để xem nó có nhỏ hơn 0 hay không, chỉ vẽ màu mặc định. Các try/catch nó có bởi vì một số logic cần phải được thêm vào để xem nếu nó là một hàng hợp lệ hay không ..... hoặc bạn chỉ có thể bỏ qua các lỗi như dưới đây (không thực sự tốt thực hành mặc dù) nhưng nên có thể sử dụng như là .

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