更改datagrid单元格的背景

时间:2012-01-06 14:46:36

标签: wpf datagrid

我可以通过以下C#代码更改datacell的背景 -

    private void Retrieve_rows(object item)
    {
        DataRow row = mygrid.GetContainerFromItem(item) as DataGrid.DataRow;

        if (row != null)
        {
            SolidColorBrush redColor = new SolidColorBrush (Colors.Red);

            foreach (DataGrid.DataCell cell in row.Cells)
            {
                 var dc = ((System.Windows.FrameworkElement)(((DataGrid.Cell)(cell)).ParentRow)).DataContext;   

              // get my custom object and change color if IsBlank value is set to true
                MyRowObject rowObject = dc as MyRowObject;

                for (int counter = 0; counter < rowObject.values.Count; counter++)
                {
                        if (rowObject.values[counter].IsBlank == true)
                            row.Cells[counter].Background = redColor;
                    }
                }
                return;
            }
        }
    }

但是使用此代码,应用程序性能会在很大程度上降低。有没有办法将上面的代码转换为XAML触发器/或任何其他方式来提高网格的性能。

3 个答案:

答案 0 :(得分:3)

由于您需要两个动态值来确定单元格的背景颜色(ColumnIndexValuesList),因此您需要使用接受这两个值的MultiConverter和返回一种颜色。

例如,

if ValueList[ColumnIndex].IsBlank)
    Return Colors.Red; // Might be Brushes.Red too, can't remember
else
    Return Colors.White;

然后可以使用没有指定Key的样式将触发器隐式应用于所有DataGridCells

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Background">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource MyMultiConverter}">
                <Binding Path="Column.DisplayIndex" RelativeSource="{RelativeSource Self}" />
                <Binding Path="ValueList" />
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

RelativeSource绑定Column.DisplayIndex可能会导致MultiBinding语法错误,但绑定应指向Self,即DataGridCell

答案 1 :(得分:0)

欢迎来到WPF世界;)

你可以试试这个:

<DataGrid Name="myGrid">
   <DataGrid.Columns>
     <DataGridTextColumn Header="Col1" Binding="{Binding Col1}" />
     <DataGridTextColumn Header="Col2" Binding="{Binding Col2}" />
   </DataGrid.Columns>
 <DataGrid.CellStyle>
   <Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Background" Value="Red" />
   </Style>
  </DataGrid.CellStyle>
</DataGrid>

干杯,

塞比

答案 2 :(得分:0)

我认为你不能因为datagrid只定义了结构而不是样式 我在网格单元格中使用矩形。

    <Rectangle Grid.Column="1" Grid.Row="1" Fill="Red"></Rectangle>
    <TextBox Grid.Column="1" Grid.Row="1" Background="Transparent" Text="test"></TextBox>