gpt4 book ai didi

c# - DataGrid 的自定义列模板

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:44 24 4
gpt4 key购买 nike

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

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

<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;
}

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

编辑:

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

最佳答案

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

<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”。

关于c# - DataGrid 的自定义列模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20657755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com