例如,在xaml中我有一个名为PersonList的DataGrid:
<DataGrid Name="PersonList" />
在代码隐藏中,我有一个Person的集合:
ObservableCollection<Person> persons = ViewModel.PersonModel;
然后我创建了一个Person DataTable,并通过以下方式将其绑定到PersonList:
PersonDataTable.Columns.Add("Name", typeof(string));
PersonDataTable.Columns.Add("Age", typeof(int));
foreach (var person in persons)
{
if (person != null)
{
PersonDataTable.Rows.Add(
Person.Name,
Person.Age
);
}
}
PersonList.ItemSource = PersonDataTable.AsDataView;
我的问题是,如何更改某一行的背景颜色?例如,使用人的年龄&gt;更改行的背景颜色。 50
我尝试通过访问PersonList.ItemSource中的每一行来完成它,但是我失败了,行总是为null:
int count = 0;
foreach (var person in PersonList.ItemSource)
{
var row = PersonList.ItemContainerGenerator.ContainerFromItem(person) as DataGridRow;
if (PersonDataTable.Rows[count].Field<int>(1) > 50)
{
row.Background = Brushes.Gray;
}
count++;
}
请帮助,WPF主人:)
答案 0 :(得分:1)
使用转换器尝试您的逻辑,如下所示:
这是我的AgeAboveLimitConverter文件:
using System;
using System.Windows.Data;
namespace DataGridSample.Converter
{
public class AgeAboveLimitConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
return (int)value > 50;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
}
然后在你的datagrid xaml文件中,
添加名称空间xmlns:converter="clr-namespace:DataGridSample.Converter"
在DataGrid中为DataGridRow添加样式,
<Grid>
<Grid.Resources>
<converter:AgeAboveLimitConverter x:Key="AgeConverter"/>
</Grid.Resources>
<DataGrid Name="PersonList">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" >
<Setter Property="Background" Value="Transparent" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Age,Converter={StaticResource AgeConverter}}" Value="true">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
</Grid>
答案 1 :(得分:0)
你快到了。请尝试以下方法:
int count = 0;
foreach (var person in PersonList.ItemSource)
{
var row = PersonList.ItemContainerGenerator.ContainerFromItem(person) as DataGridRow;
if (PersonDataTable.Rows[count].Field<int>(1) > 50)
{
row.DefaultCellStyle.BackColor = Color.Gray;
}
count++;
}