2017-06-22 94 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屬性。