【问题标题】:Convert DataGrid cell content转换 DataGrid 单元格内容
【发布时间】:2013-08-25 16:08:51
【问题描述】:

我有一个 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。

【问题讨论】:

    标签: wpf data-binding datagrid datatable converter


    【解决方案1】:

    首先,您将名称为 setter 的变量添加到 Setters 集合中,但您定义的是名称为 mySetter 的变量。这可能是您的 Converter 未被实际调用的原因。

    此外,您的问题的解决方案会稍微复杂一些。 实际上 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 列中使用转换器。

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多