2017-06-22 54 views
0

TL; DR:如果DataGrid细胞被绑定到特定的对象(而不是字符串,整数,...),我怎么能访问它在转换器或二传手?绑定的对象数据网格单元 - 有条件单元格样式

完整版:

我有一个绑定到一个DataTableDataGrid

<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; 
    } 
} 

如何显示在每个有IsAdult == falseName列不同的背景?我试图使用一些转换器,但我无法访问任何地方的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

你在哪里以及如何使用转换器? – mm8

+0

查看更新后的问题。 – bpiec

+0

*“改为'object'不会改变任何东西,我仍然得到DataGridCell”*没有任何通信给我。我的答案中的代码已经过测试并完美工作。如果您无法将其推广到类似的问题,或者如果您的实际问题与您发布的代码不相似,我无法帮助您。您无法使用自动生成的列来完成此操作。祝你好运。 –

回答

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

相关问题