TL; DR :如果
DataGrid
单元格绑定到特定对象(不是string,int,...),如何在转换器或setter中访问它? / p>
完整版:
我有DataGrid
绑定到DataTable
:
<Window x:Class="TabControlTests.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="grid" ItemsSource="{Binding Data}" />
</Grid>
</Window>
DataTable
是动态生成的(在现实代码中我不知道列名称):
public partial class MainWindow : Window
{
public DataTable Data { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
SetDataTable();
}
private void SetDataTable()
{
var dt = new DataTable();
var name = new DataColumn("Name", typeof(object));
var age = new DataColumn("Age", typeof(int));
var home = new DataColumn("Home", typeof(string));
dt.Columns.Add(name);
dt.Columns.Add(age);
dt.Columns.Add(home);
AddRow(dt, "Kavitha Reddy", 15, "NY");
AddRow(dt, "Kiran Reddy", 24, "LA");
AddRow(dt, "John Doe", 55, "TX");
Data = dt;
}
private void AddRow(DataTable dt, string name, int age, string home)
{
var dr = dt.NewRow();
dr["Name"] = new Person(name, age >= 18);
dr["Age"] = age;
dr["Home"] = home;
dt.Rows.Add(dr);
}
}
}
请注意,对于Name
列,我分配了一个对象,而不是字符串。由于它实现了ToString()
方法,因此显示名称:
public class Person
{
public string Name { get; set; }
public bool IsAdult { get; set; }
public Person(string name, bool isAdult)
{
Name = name;
IsAdult = isAdult;
}
public override string ToString()
{
return Name;
}
}
如何为Name
的每个人在IsAdult == false
列中显示不同的背景?我试图使用一些转换器,但我无法在任何地方访问Person
对象,我得到的只是DataGridCell
实例。
修改
这就是我尝试使用转换器的方式:
<Window.Resources>
<local:ValueToBrushConverter x:Key="ValueToBrushConverter" />
<Style x:Key="CellStyle" TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ValueToBrushConverter}}" />
</Style>
</Window.Resources>
<Grid>
<DataGrid x:Name="grid" ItemsSource="{Binding Data}" CellStyle="{StaticResource CellStyle}" />
</Grid>
答案 0 :(得分:2)
您无法将Person
对象真正存储在DataRow
中。您可以自己确认:
var dr = dt.NewRow();
//set the Name column to a Person object
dr["Name"] = new Person(name, age >= 18);
//...and retrieve it. It is now a string:
var thePerson = dr["Name"] as string;
将对象模型与DataTable
混合不是一个好主意。您应该将DataTable
替换为自定义对象的集合。然后,您将能够使用值转换器或DataTrigger
来设置单元格的Background
属性。