我有一个DataSrid,其ItemsSource设置为DataTable。 DataTable有一个DateTime类型的列,如果特定单元格中的日期是特定值,我想显示信息文本(即“N / A”)。
我的第一个想法是以某种方式将单元格内容绑定到自身,并使用转换器,但我似乎无法让它正常工作,似乎应该有更好的方法。
此外,DataGrid和DataTable都是动态生成的,因此必须在后面的代码中完成。
这是我最初尝试过的代码:
// Create a new DataGridCellStyle
Style myStyle = new Style();
myStyle.TargetType = typeof(DataGridCell);
// Create the binding
Binding myBinding = new Binding();
myBinding.RelativeSource = RelativeSource.Self;
myBinding.Converter = new DateTimeToStringConverter();
// Add the Content setter
Setter mySetter = new Setter();
mySetter.Property = ContentProperty;
mySetter.Value = myBinding;
myStyle.Setters.Add(setter);
// Set the Style and ItemsSource
myDataGrid.CellStyle = myStyle ;
myDataGrid.ItemsSource = myDataTable.DefaultView;
DateTimeToStringConverter确实实现了IValueConverter,但我猜测问题出在绑定的某个地方,因为在显示DataGrid时,实际上从未调用DateTimeToStringConverter。
答案 0 :(得分:1)
首先,您将名为 setter 的变量添加到Setters集合中,但您要定义名称为 mySetter 的变量。这可能是一个原因,为什么你的转换器实际上没有被调用。
此外,您的问题的解决方案会更复杂一些。 实际上,Convert获取RowDataView类型的值,该值包含整行的数据。转换器中没有关于实际绑定的Column或Cell的信息。
最好跳过AutoGenerateColumns并以编程方式生成它们。 这是一个例子:
myDataGrid.ItemsSource = myDataTable.DefaultView;
myDataGrid.AutoGenerateColumns = false;
foreach (DataColumn column in myDataTable.Columns)
{
Binding binding = new Binding(column.ColumnName)
{
Converter = new DateTimeToStringConverter()
};
DataGridColumn gridColumn = new DataGridTextColumn
{
SortMemberPath = column.ColumnName,
Header = column.ColumnName,
Binding = binding
};
myDataGrid.Columns.Add(gridColumn);
}
当然,对于性能,最好只在DateTime列中使用转换器。