Условное форматирование шрифта в сетке данных WPF - PullRequest
1 голос
/ 14 июля 2011

У меня есть таблица данных WPF, заполненная набором данных.Я пытаюсь изменить цвет шрифта данных в двух столбцах.У меня это работает, используя

REMOVED OLD CODE

Но он не очень хорошо держит цвета, особенно когда в сетке есть прокрутка.Это также медленно.

Возможно ли это сделать с помощью IValueCoverter или есть какой-то другой более эффективный способ добиться этого?

РЕДАКТИРОВАТЬ

Я попытался по-новому взглянуть на эту проблему.Я создал класс для возврата bool, а затем с помощью этого bool определил, будет ли шрифт зеленым или красным.

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>


Я пытаюсь заставить его работать в двух столбцах, но он изменит цвет шрифта только в одном.

Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Может быть, вы могли бы попробовать оформить ячейки столбца стилем, у которого есть свойство «Триггеры на переднем плане»?

http://blogs.msdn.com/b/jaimer/archive/2009/01/20/styling-microsoft-s-wpf-datagrid.aspx

0 голосов
/ 22 июля 2011
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;
            }

На всякий случай, если кто-то хочет получить ответ, он на самом деле работает, пока он вызывается только в

DgInvoiceLines_CellEditEnding и DgInvoiceLines_CurrentCellChanged .

Я назвал это в DgInvoiceLines_SelectionChanged , что, кажется, заставляет его вести себя странно.

HTH!

...