Conditional formatting of the font in a WPF Datagrid

此生再无相见时 提交于 2019-12-11 08:28:43

问题


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?


回答1:


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




回答2:


int i = DgInvoiceLines.SelectedIndex;
            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();

            DataGridCell InvQtyCell = GetCell(i, 2);
            DataGridCell GrnQtyCell = GetCell(i, 3);
            DataGridCell InvPriCell = GetCell(i, 4);
            DataGridCell GrnPriCell = GetCell(i, 5);
            DataGridCell InvTotCell = GetCell(i, 6);
            DataGridCell GrnTotCell = GetCell(i, 7);

            string InvoiceCellContentType = InvQtyCell.Content.GetType().Name.ToString();
            string GRNCellContentType = GrnQtyCell.Content.GetType().Name.ToString();
            string InvPriContentType = InvPriCell.Content.GetType().Name.ToString();
            string GrnPriContentType = GrnPriCell.Content.GetType().Name.ToString();
            string InvTotCellType = InvTotCell.Content.GetType().Name.ToString();
            string GrnTotCelType = GrnTotCell.Content.GetType().Name.ToString();

            if (iqty == gqty) 
            {
                if (InvoiceCellContentType == "TextBlock") ((TextBlock)InvQtyCell.Content).Foreground = Brushes.DarkGreen;
                else if (InvoiceCellContentType == "TextBox") ((TextBox)InvQtyCell.Content).Foreground = Brushes.DarkGreen;
                if (GRNCellContentType == "TextBlock") ((TextBlock)GrnQtyCell.Content).Foreground = Brushes.DarkGreen;
                else if (GRNCellContentType == "TextBox") ((TextBox)GrnQtyCell.Content).Foreground = Brushes.DarkGreen;
            }
            else
            {
                if (InvoiceCellContentType == "TextBlock") ((TextBlock)InvQtyCell.Content).Foreground = Brushes.Red;
                else if (InvoiceCellContentType == "TextBox") ((TextBox)InvQtyCell.Content).Foreground = Brushes.Red;
                if (GRNCellContentType == "TextBlock") ((TextBlock)GrnQtyCell.Content).Foreground = Brushes.Red;
                else if (GRNCellContentType == "TextBox") ((TextBox)GrnQtyCell.Content).Foreground = Brushes.Red;
            }

            if (iprice == gprice) 
            {
                if (InvPriContentType == "TextBlock") ((TextBlock)InvPriCell.Content).Foreground = Brushes.DarkGreen;
                else if (InvPriContentType == "TextBox") ((TextBox)InvPriCell.Content).Foreground = Brushes.DarkGreen;
                if (GrnPriContentType == "TextBlock") ((TextBlock)GrnPriCell.Content).Foreground = Brushes.DarkGreen;
                else if (GrnPriContentType == "TextBox") ((TextBox)GrnPriCell.Content).Foreground = Brushes.DarkGreen;
            }
            else
            {
                if (InvPriContentType == "TextBlock") ((TextBlock)InvPriCell.Content).Foreground = Brushes.Red;
                else if (InvPriContentType == "TextBox") ((TextBox)InvPriCell.Content).Foreground = Brushes.Red;
                if (GrnPriContentType == "TextBlock") ((TextBlock)GrnPriCell.Content).Foreground = Brushes.Red;
                else if (GrnPriContentType == "TextBox") ((TextBox)GrnPriCell.Content).Foreground = Brushes.Red;
            }

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!



来源:https://stackoverflow.com/questions/6691082/conditional-formatting-of-the-font-in-a-wpf-datagrid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!