我目前有一個DataGrid
,它通過ItemSource
綁定到DataTable
。我希望能夠將一個CellTemplate(MyTemplate)應用於DataGrid
中某個類型的所有列(MyType)。將CellTemplate分配給C#/ WPF中動態生成的DataGridTemplateColumn
由於DataTable
具有動態數量的列,我不能禁用AutoGenerateColumns
並手動在WPF定義DataGridTemplateColumns
。
這是我DataTable
在WPF:
<DataGrid HeadersVisibility="Column" VerticalScrollBarVisibility="Visible" CanUserAddRows="False"
IsSynchronizedWithCurrentItem="False" FontSize="12" BorderThickness="0,1,0,0" RenderTransformOrigin="0.5,0.5"
ItemsSource="{Binding MyDataTable}" AutoGenerateColumns="True" AutoGeneratingColumn="GeneratingColumnEvent"/>
的DataTemplate
我要分配在UserControl's
資源字典的定義(和工作在一個明確使用時定義DataGridTemplateColumn
)。
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<SharedResourceDictionary Source="{Resources Directory}/MyTemplates.xaml"/>
</ResourceDictionary.MergedDictionaries>
<FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/>
</ResourceDictionary>
</UserControl.Resources>
我AutoGenerateColumn事件的定義是這樣的:
private void GeneratingColumnEvent(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof (MyType))
{
var newCol = new DataGridCandidateTemplateColumn
{
CellTemplate = (DataTemplate) FindResource("MyTemplate"),
ColumnName = e.PropertyName,
};
e.Column = newCol;
e.Column.Header = e.PropertyName;
}
}
有了這樣定義的自定義DataGridCandidateTemplateColumn
類:
class DataGridCandidateTemplateColumn : DataGridTemplateColumn
{
public string ColumnName { get; set; }
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
// The DataGridTemplateColumn uses ContentPresenter with your DataTemplate.
ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
// Reset the Binding to the specific column. The default binding is to the DataRowView.
if (cp != null)
BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
return cp;
}
}
如果我不嘗試應用模板,該列使用toString表示MyType。如果我像上面那樣應用模板,則列的單元格中不顯示任何內容。我錯過了什麼?
請縮小你的問題並添加一些清晰度:您是否禁用了AutoGenerateColumns?最好的問候, –
@AlexBell對不起,我正在編輯代碼示例以包含相關部分,並沒有注意到問題在這個過程中混亂了。爲了更加清晰,我編輯了粗體字。 – Typer525