2009-11-16 11 views
22

WPF araç veri kılavuzunu kullanıyorum ve ben içeriğine göre, bir hücreye değil, satır arka plan rengini ayarlamak istiyorum kullanarak bir hücrenin arka plan rengini nasıl değiştirebilirim hücre.WPF Toolkit veri kılavuzunu

Basitlik uğruna sütunun Foo olduğunu ve Foo 1 olduğunda hücrenin arka planının mavi olmasını, Foo 2 olduğunda kırmızı, Foo 3 olduğunda sarı, Foo olduğunda 3 ve Yeşil olduğunda bunu yapabiliyorsa, ben uğraşmak gerek daha karmaşık durumların herhangi çözebilir eminim büyük 3.

fazla. Bunu nasıl yollardan

cevap

33

ilgili:

DataGridTextColumn xaml:

<DataGridTextColumn Width="SizeToCells" 
         MinWidth="150" 
         Binding="{Binding Name}"> 

    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="TextBlock.Background" Value="{Binding Color}" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

veri öğesi beyan İşte bir örnek. Sadece bu durumda Green, varsayılan arka plan özelliği ile ElementStyle ayarlayın ve diğer durumlar için DataTriggers ekleyin: bununla

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" > 
    <DataGridTextColumn.ElementStyle> 
    <Style TargetType="{x:Type TextBlock}"> 

     <Setter Property="Background" 
     Value="{Binding Foo, Converter={x:Static my:FooToColorConverter.Instance}}" /> 

    </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

:

<DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" > 
    <DataGridTextColumn.ElementStyle> 
    <Style TargetType="{x:Type TextBlock}"> 

     <Setter Property="Background" Value="Green" /> 

     <Style.Triggers> 
     <DataTrigger Binding="{Binding Foo}" Value="1"> 
      <Setter Property="Background" Value="Blue" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Foo}" Value="2"> 
      <Setter Property="Background" Value="Red" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Foo}" Value="2"> 
      <Setter Property="Background" Value="Yellow" /> 
     </DataTrigger> 

     </Style.Triggers> 
    </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

başka bir yaklaşım, bir dönüştürücü ile bağlama kullanmaktır çevirici: serge_gubenko yanı çalışacak verdi cevap

public class FooToColorConverter : IValueConverter 
{ 
    public static readonly IValueConverter Instance = new FooToColorConverter(); 
    public object Convert(object value, ... 
    { 
    int foo = (int)value; 
    return 
     foo==1 ? Brushes.Blue : 
     foo==2 ? Brushes.Red : 
     foo==3 ? Brushes.Yellow : 
     foo>3 ? Brushes.Green : 
     Brushes.Transparent; // For foo<1 
    } 
    public object ConvertBack(... 
    { 
    throw new NotImplementedException(); 
    } 
} 

Not fakat sadece eğer Foo özellik değeri ne Ver değişir. Bunun nedeni, Renk özelliği alıcı yalnızca bir kez çağrılacak olmasıdır. Onun çözümü salt okunur DependencyProperty için Renk değiştirme ve Foo atanan her onu güncelleyerek iyileştiğini, ancak genellikle veri modelindeki renklerin gibi UI özgü bilgi sahibi kötü bir fikir, bu yüzden tavsiye edilmez edilebilir.

+0

Çok teşekkür ederim. Ben WPF ile çalışmak için çok sinir bozucu buluyorum çünkü o hataları gizleme eğilimi ve sadece doğru kodu yoksa bir şey yapmaz. Ama ne zaman çalıştığını ve ne yaptığını bildiğinde, yıldırım hızlı ve kullanımı kolaydır. WPF'nin kullandığım herhangi bir teknolojinin en dik öğrenme eğrisine sahip olduğunu dürüstçe söyleyebilirim. Neyse, tekrar teşekkürler. Dönüştürücüye gittim çünkü bana en büyük esnekliği veriyor. –

+0

Güzel .. !!! Benim tarafımdan +1 .. !! – samar

6

Bir sütun için ElementStyle tanımlamak ve sonra datagrid sıranın arkasında veri öğesi renk özelliğine textblock arka planını bağlamaktır. Bu yardımcı olur

public class TestItem 
{ 
    public TestItem(int foo) 
    { 
     Foo = foo; 
    } 

    public int Foo { get; set; } 
    public Brush Color 
    { 
     get 
     { 
      Color color = Colors.Green; 
      switch (Foo) 
      { 
       case 1: color = Colors.Red; break; 
       case 2: color = Colors.Yellow; break; 
      } 
      return new SolidColorBrush(color); 
     } 
    } 
} 

umut Sen Stiller ve DataTriggers ile bunu

+0

Bu işe yaramaz sonra mülkiyet NotifyPropertyChanged için ("yourproperty") çağrı değişecek zaman INotifyPropertyChanged itibaren devralan eğer serge_gubenko iyi çalışır: hücre rengi güncellenmez. Daha fazla bilgi için cevabımı görün. –

+0

Ve ne Foo görüntülenirken (örneğin, veri bağlama nedeniyle) ızgara görüntüleniyor. Eh eski – greenoldman

+0

, ancak renk değişiklikleri UI bildirmek için, bu sınıf TestItem tarafından INotifyPropertyChanged uygulamak etmektir düzeltmek için gereken tüm. – Tafari

1

öğe ızgara gösterildikten sonra Foo değeri hiç değişirse