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