Wpf 转换DataGrid单元格内容

Wpf 转换DataGrid单元格内容,wpf,data-binding,datagrid,datatable,converter,Wpf,Data Binding,Datagrid,Datatable,Converter,我有一个DataGrid,其ItemsSource设置为DataTable。DataTable有一个DateTime类型的列,如果特定单元格中的日期是某个值,我希望显示信息文本(即“N/a”) 我的第一个想法是以某种方式将单元格内容绑定到自身,并使用转换器,但我似乎无法使其正常工作,似乎应该有更好的方法 此外,DataGrid和DataTable都是动态生成的,因此这必须在代码隐藏中完成 以下是我最初尝试的代码: // Create a new DataGridCellStyle Style m

我有一个DataGrid,其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实际上从未被调用。

首先,您将名为setter的变量添加到Setters集合中,但是您需要使用名称mySetter定义变量。这可能是您的转换器未实际调用的原因之一

另外,您的问题的解决方案将更加复杂。 实际上,Convert会获取一个RowDataView类型的值,该值包含整行的数据。转换器中没有关于实际绑定的列或单元格的信息

最好是跳过AutoGenerateColumn并以编程方式生成它们。 下面是一个例子:

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列中使用转换器