【问题标题】:Custom column template for DataGridDataGrid 的自定义列模板
【发布时间】:2014-01-06 14:35:58
【问题描述】:

我有一个绑定到 DataTable.DefaultView 的 DataGrid,它使用自动生成列来呈现网格。那部分工作正常。但是,对于某些列,我想使用自定义模板。问题是每次加载时表中的列都会发生变化,因此解决方案需要通用。

我可以按照here 的描述挂钩到 AutoGeneratingColumn 事件,但在定义模板绑定时仍然存在问题:

<UserControl.Resources>
    <DataTemplate x:Key="customCellTemplate">
        <TextBlock Text="{Binding ???"></TextBlock>
    </DataTemplate>
</UserControl.Resources>

(...)

<DataGrid ItemsSource="{Binding DefaultView}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn">
</DataGrid>

还有我的代码:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    string colName = e.PropertyName;
    if (someCondition)
    {
        var templateColumn = new DataGridTemplateColumn();
        templateColumn.Header = colName;
        templateColumn.CellTemplate = (DataTemplate)Resources["customCellTemplate"];
        templateColumn.SortMemberPath = colName;
        e.Column = templateColumn;
     }

如您所见,我不知道如何在列模板中定义绑定,因为列名发生了变化。

编辑:

除了接受的答案 - 有时更容易以编程方式创建整个模板,如下所述: http://fczaja.blogspot.com/2013/12/wpf-datagrid-custom-template-for.html

【问题讨论】:

    标签: c# wpf xaml data-binding datagrid


    【解决方案1】:

    使用StaticResource 会强制您保持不变——请记住,静态意味着只有一个实例,因此如果您为一列更改它的绑定,您将为所有列更改它。所以它必须是这样的:

    <DataTemplate x:Key="customCellTemplate">
        <TextBlock Text="{Binding}"></TextBlock>
    </DataTemplate>
    

    我在想您可以通过使用ContentControl 将其包装在另一个 DataTemplate 中来以动态方式使用此模板。动态设置Content属性,ContentTemplate使用静态模板:

    private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        string colName = e.PropertyName;
        if (someCondition)
        {
            string xaml = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""><ContentControl Content=""{0}"" ContentTemplate=""{1}"" /></DataTemplate>";
            var tmpl = (DataTemplate)XamlReader.Load(string.Format(xaml, "{Binding " + colName + "}", "{StaticResource customCellTemplate}"));
            var templateColumn = new DataGridTemplateColumn();
            templateColumn.CellTemplate = tmpl;
            templateColumn.Header = colName;
            templateColumn.SortMemberPath = colName;
            e.Column = templateColumn;
         }
    }
    

    唯一的问题是,通过这种设置,我相信“customCellTemplate”必须在应用程序级别定义。

    【讨论】:

    • 这种方法有效,但是我需要在用户控制级别而不是应用程序上定义这个单元格模板。原因是我正在开发一个 UserControl 库,它将被多个应用程序重用。有什么解决方法吗?此外,当前代码不会像 XamlReader.Load 期望的流那样编译(容易修复)。
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多