将对象绑定到数据网格单元格 - 条件单元格样式

时间:2017-06-22 12:52:05

标签: c# wpf data-binding datagrid

  

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>

1 个答案:

答案 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属性。

相关问题