2010-09-08 19 views
9

Sıralı arka plan renkleri olan veriye bağlı bir DataGrid'im var. İçerdiği verilere dayanarak farklı bir hücreyi renklendirmek istiyorum. Ben bu konuyaWPF - Bir DataGridRow'dan nasıl hücre alınır?

her zaman null döndürür

DataGridCellsPresenter sunum = GetVisualChild

(satır)

http://wpf.codeplex.com/Thread/View.aspx?ThreadId=51143

Ama önerdiği çözüm çalıştılar.

Ben

public static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 

kullanıyorum Ama VisualTreeHelper.GetChildrenCount() Bir DataGridRow her zaman ben DataGridRow boş değildir ve zaten verilerle doldurulan doğruladıktan 0. döndürür. Herhangi bir yardım takdir edilir.

Teşekkürler.

cevap

8

İlk şey ilk önce, bunu kod arkasında yapmayın. Çerçeveyi bu şekilde yapmanın yolu ile savaşıyorsun. WPF farklı dizayn edilmiştir; Çerçevenin bazı şeyleri yapmanı istediği konusunda düşünmelisin. WPF durumunda, XAML biçimlendirme + dönüştürücü sınıfları. kurulum için

  • Uygun XAML işaretlemeyi DataGrid
  • Bir IValueConverter uygulama tarzı uygun vurgulamak renk içine metnin değerini çevirmek için:

    Ne istediğini elde etmek için iki şey gerekir.

Buraya: Kişisel veri kılavuzunu

yılında

XAML yapmak istediğiniz ilk şey, sizin DataGrid hücreleri stil gerekli XAML tanımlamaktır.

<toolkit:DataGrid.CellStyle> 
     <Style TargetType="{x:Type toolkit:DataGridCell}"> 
     <Style.Setters> 
      <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource dataGridCellConverter}}" /> 
     </Style.Setters> 
     </Style> 
    </toolkit:DataGrid.CellStyle> 

Bunun bir RelativeSource (DataGridCell) bağlanarak kurma ve Dönüştürücü geçmesine değeri olarak hücrenin Content.Text kullanmak için anlatıyor yapıyor (dataGridCellConverter: Şuna benzer).

IValueConverter

İhtiyacınız sonraki şey aslında hücrenin metne dayanan renkleri belirlemek için bir IValueConverter uygulamasıdır: Burada

using System; 
using System.Globalization; 
using System.Windows.Data; 
using System.Windows.Media; 
namespace UserControls.Utility.Converters 
{ 
    public class DataGridCellConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) return Colors.White.ToString(); 

     if (value.ToString().ToUpper().Contains("CMS")) return "LIME"; 

     return "ORANGE"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

, sadece metin arıyorum "CMS" ve arka plan hücresinin renklendirilmesi; "CMS" mevcut değilse, bunun yerine turuncu rengi döndürür.

<UserControl.Resources> 
    <Converters:DataGridCellConverter x:Key="dataGridCellConverter"/> 
</UserControl.Resources> 

Ve bunu olmalıdır:

Şimdi Kaynakları

belirtin, uygun kaynak olarak dönüştürücü belirtmek için pencerenizin/usercontrol yapılan işaretlemeleri eklemem gerekiyor! İyi şanslar. satırınızın ve erişmek istediğiniz hücrenin endeksi biliyorsanız

+0

+1 - çok ayrıntılı yanıt – David

+3

'WPF durumunda, XAML biçimlendirme + dönüştürücü sınıflarıdır.' - Bu sizin kişisel algı –

11

, daha sonra burada kodda bunu yapabilirsiniz:

//here's usage 
var cell = myDataGrid.GetCell(row, columnIndex); 
if(cell != null) 
    cell.Background = Brushes.Green; 

DataGrid Uzantısı:

public static class DataGridExtensions 
{ 
    public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int columnIndex = 0) 
    { 
     if (row == null) return null; 

     var presenter = row.FindVisualChild<DataGridCellsPresenter>(); 
     if (presenter == null) return null; 

     var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 
     if (cell != null) return cell; 

     // now try to bring into view and retreive the cell 
     grid.ScrollIntoView(row, grid.Columns[columnIndex]); 
     cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 

     return cell; 
    } 
+1

sizin gerçek cevabıdır. –

+0

Böyle bir şey deniyorum ama işe yaramıyor. Bu konuyu kontrol edebilirsiniz http://stackoverflow.com/questions/32584353/wpf-control-datagrid-cell-color-change –

+1

Aşağıdaki [yöntemleri] eklerseniz hoş (http://stackoverflow.com/a/25229554/2470362) cevaba. –

İlgili konular