WPF DataGrid自定义模板自动生成的列内容绑定

时间:2019-01-04 14:05:57

标签: wpf data-binding wpfdatagrid

所以我有一个数据网格,它的SourceItem结构是未知的,但是需要细微调整...我正在使用AutoGenerateColumns,但是对于其中一种数据类型,我使用dg_AutoGeneratingColumn事件用自己的列覆盖了其中, e.PropertyType,并使用我的新ColumnTemplate(继承自DataGridBoundColumn)重写e.Column。

通常来说,它可以执行并呈现良好的效果,只是我试图使数据绑定(路径未知)流入我的自定义ColumnTemplate。

CustomTemplate : DataGridBoundColumn
{
    public static DependencyProperty dpblah;
    private void MyCode() { GetValue(dpBlah); }
}

DataGrid_AutoGeneratingColumn(...) {
    var oldBinding = (e.Column as DataGridBoundColumn).Binding;
    e.Column = new CustomTemplate { Header = e.PropertyName };
    BindingOperations.SetBinding(e.Column, dpBlah, oldBinding);
}

一切似乎都在运行,但是当MyCode()运行时,GetValue将一无所有。

有什么我想念的吗?为什么不能从绑定中获取值?

1 个答案:

答案 0 :(得分:0)

您可以将属性设置为绑定的路径,然后在CustomTemplate类中创建可视元素时使用此路径:

var oldBinding = (e.Column as DataGridBoundColumn).Binding as Binding;
e.Column = new CustomTemplate { Header = e.PropertyName, dpblah = oldBinding?.Path?.Path; };

然后在CustomTemplate中,您可以使用反射来获取特定项目的属性值,例如:

protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
    string bindingPath = dpblah;
    object value = dataItem.GetType().GetProperty(bindingPath).GetValue(dataItem);
    ...
}

如果dataItemDataRowView,则不必使用反射:

DataRowView drv = dataItem as DataRowView;
if(drv != null)
{
    object value = drv[bindingPath];
}