I have a WPF Datagrid populated using a Dataset. I am trying to change the font colour of the data in two columns. I have it working using
REMOVED OLD CODE
But it isn't holding the colours very well especially when there is scrolling on the grid. It is also slow.
Is it possible to do this using an IValueCoverter
or is there some other more efficient way to achieve this?
EDIT
I have tried to take a new approach to this problem. I have created a class to return a bool and then use that bool to determine whether the font will be green or red.
CLASS
class EqualValuesColourConverter
{
public static void ChangeColours(int pQty, int pPri, int pTot, int gQty, int gPri, int gTot)
{
int iqty = pQty;
int gqty = gQty;
int iprice = pPri;
int gprice = gPri;
int itotal = pTot;
int gtotal = gTot;
bool fontColor = true;
if ((iqty == gqty) && (iprice == gprice) && (itotal == gtotal)) fontColor = true;
else fontColor = false;
}
}
CALL TO CLASS
string iqty = ((DataRowView)DgInvoiceLines.SelectedItem)["Inv_Quantity"].ToString();
string gqty = ((DataRowView)DgInvoiceLines.SelectedItem)["Grn_Quantity"].ToString();
string iprice = ((DataRowView)DgInvoiceLines.SelectedItem)["Inv_Price"].ToString();
string gprice = ((DataRowView)DgInvoiceLines.SelectedItem)["Grn_Price"].ToString();
string itotal = ((DataRowView)DgInvoiceLines.SelectedItem)["Inv_Total"].ToString();
string gtotal = ((DataRowView)DgInvoiceLines.SelectedItem)["Grn_Total"].ToString();
int pQty = int.Parse(iqty);
int pPri = int.Parse(iprice);
int pTot = int.Parse(itotal);
int gQty = int.Parse(gqty);
int gPri = int.Parse(gprice);
int gTot = int.Parse(gtotal);
EqualValuesColourConverter.ChangeColours(pQty, pPri, pTot, gQty, gPri, gTot);
XAML
<DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity}">
<DataGridTextColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Foreground" Value="Green"/>
<Style.Triggers>
<DataTrigger Binding="{Binding EqualValuesColourConverter}" Value="False" >
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
I am trying to get it to work in two columns but it will only change the font colour in one.
Can anyone help?
Just in case any one wanted the answer this actually works as long as it is called in
DgInvoiceLines_CellEditEnding and DgInvoiceLines_CurrentCellChanged only.
I had called it in DgInvoiceLines_SelectionChanged which seems to make it behave strangely.
HTH!
Maybe you could try Styling your column cells with style that has Triggers on Foreground property?
http://blogs.msdn.com/b/jaimer/archive/2009/01/20/styling-microsoft-s-wpf-datagrid.aspx