Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGrid的自定义列模板_C#_Wpf_Xaml_Data Binding_Datagrid - Fatal编程技术网

C# DataGrid的自定义列模板

C# DataGrid的自定义列模板,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,我将DataGrid绑定到DataTable.DefaultView,该视图使用自动生成列来呈现网格。那部分很好用。但是,对于某些列,我希望使用自定义模板。问题是表中的列在每次加载时都会发生变化,因此解决方案需要通用 我可以如所述钩住AutoGeneratingColumn事件,但在定义模板绑定时仍然存在问题: <UserControl.Resources> <DataTemplate x:Key="customCellTemplate"> <

我将DataGrid绑定到DataTable.DefaultView,该视图使用自动生成列来呈现网格。那部分很好用。但是,对于某些列,我希望使用自定义模板。问题是表中的列在每次加载时都会发生变化,因此解决方案需要通用

我可以如所述钩住AutoGeneratingColumn事件,但在定义模板绑定时仍然存在问题:

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

(...)

<DataGrid ItemsSource="{Binding DefaultView}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn">
</DataGrid>
如您所见,我不知道如何在列模板中定义绑定,因为列名会更改

编辑:

除了可接受的答案之外,有时以编程方式创建整个模板更容易,如下所述:

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

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

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

这种方法是有效的,但是我需要在用户控制级别定义这个单元格模板,而不是应用程序。原因是我正在开发一个UserControl库,它将被多个应用程序重用。有解决办法吗?此外,当前代码不会编译为XamlReader.Load预期的流(易于修复)。
<DataTemplate x:Key="customCellTemplate">
    <TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
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;
     }
}