2009-03-26 6 views
2

Ich möchte die Vordergrundfarbe von Zellen, die negative Zahlen enthalten, ändern, aber ich weiß nicht, wie Sie den DataTrigger angeben, der mich lassen würde. Ich verwende etwas wie folgt aus:So erhalten Sie den Bindungswert der aktuellen Zelle in einem WPFToolkit DataGrid

<Style x:Key="NumberCellStyle" BasedOn="{StaticResource CellStyle}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Converter={StaticResourceExtension SignConverter}}" Value="-1"> 
      <Setter Property="TextBlock.Foreground" Value="Red"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Aber im SignConverter Konverter Ich bekomme die ganze Ansichtsmodell statt den numerischen Wert I umwandeln möchten. Ich möchte, dass dies über die App funktioniert, ohne dass ich für jede Bindung den richtigen Pfad angeben muss.

Vielen Dank!

Antwort

2

Bessere Möglichkeit, schreiben Sie eine benutzerdefinierte Spalte.

Der Code folgt für alle, die in der gleichen Situation ist:

public class DataGridDecimalColumn : DataGridTextColumn 
{ 
    Binding    foregroundBinding; 
    DecimalBrushConverter brushConverter = new DecimalBrushConverter { 
     NegativeBrush = Brushes.Red, 
     PositiveBrush = Brushes.Black, 
     ZeroBrush  = Brushes.Black, 
    }; 

    protected override FrameworkElement 
    GenerateElement(DataGridCell cell, object dataItem) 
    { 
     var element = base.GenerateElement(cell, dataItem) as TextBlock; 
     element.SetBinding(TextBlock.ForegroundProperty, GetForegroundBinding()); 
     return element; 
    } 

    Binding 
    GetForegroundBinding() 
    { 
     if(foregroundBinding == null) { 
      var binding  = (Binding)Binding; 
      foregroundBinding = new Binding { 
       Path  = binding.Path, 
       Converter = BrushConverter, 
      }; 
     } 
     return foregroundBinding; 
    } 

    public DecimalBrushConverter 
    BrushConverter 
    { 
     get { return brushConverter; } 
     set { brushConverter = value; } 
    } 
} 

DecimalBrushConverter einfach eine Dezimalzahl nimmt? und konvertiert es abhängig von seinem Wert in einen der angegebenen Pinsel.

0

Mit welcher Kontrolle wenden Sie auch den Stil an? Es klingt wie alles, auf das Sie es anwenden, hat keine spezifischen Bindungen für sich selbst festgelegt, so erbt es nur den Wert seiner Eltern, die am Ende Ihre ViewModel Instanz ist.

Update: Basierend auf dem Kommentar, denke ich, dass Sie einen Pfad im Binding Ausdruck des Stils angeben müssen. Da kein Pfad angegeben ist, wird nur die aktuelle DataContext verwendet, die die gesamte ViewModel Instanz ist.

+0

Ich verwende WPFToolkit DataGrid, wo Sie die Bindungen für verschiedene Arten von Spalten angeben. In diesem Fall ist es der ElementStyle einer DataGridTextColumn. Die Zellen zeigen Zahlen an, aber ich bekomme stattdessen das ViewModel. –

+0

Ich verstehe, dass, was ich will ist nicht, einen Pfad anzugeben, so dass jede Spalte, die eine Nummer enthält und diesen Stil erhält, rot gezeichnet werden kann, wenn die Zahl negativ ist. Gibt es eine Möglichkeit, den Pfad in einem anderen Binding anzugeben? –

+0

Ehrlich gesagt bin ich mir nicht sicher. Wenn die Spalte einen DataContext hätte, würde ich sagen, dass ich die Daten für die Spalte an diese binden würde und das würde funktionieren, aber es sieht so aus, als hätte es keinen DataContext. Ich bin also nicht sicher, ob es einen Weg gibt, leider. – Andy

0

OK, ich habe keinen Weg gefunden, mein ursprüngliches Problem zu lösen, aber ich werde es umgehen, indem ich eine DataGridTemplateColumn mit Vorlagen verwende, die die Vordergrundfarbe in Abhängigkeit vom Wert, der an sie gebunden ist, korrekt festlegen.

0

Wie würden Sie diesen Code zum Lesen der IsSelected-Eigenschaft des DataGrid selbst erhalten? Ich habe den folgenden Code ausprobiert, kann aber nicht herausfinden, wie der Bool-Wert in ConverterParameter abgerufen wird, wobei der DecimalBrushConverter den Parameter liest und SelectedBrush bereitstellt, wenn isSelected == true ist.

public class DataGridDecimalColumn: Datagridtextcolumn { privaten Nur-Lese-DecimalBrushConverter _brushConverter = new DecimalBrushConverter { NegativeBrush = Brushes.Red, PositiveBrush = Brushes.Black, ZeroBrush = Brushes.Black, SelectedBrush = Brushes.White } ;

Verwandte Themen