我可以通过以下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触发器/或任何其他方式来提高网格的性能。
答案 0 :(得分:3)
由于您需要两个动态值来确定单元格的背景颜色(ColumnIndex
和ValuesList
),因此您需要使用接受这两个值的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>