我遵循了描述here的简单方法,并拥有一个动态生成列的DataGrid,允许动态使用和绑定DataTemplates。
for (int i = 0; i < testDataGridSourceList.DataList[0].Count; i++)
{
var binding = new Binding(string.Format("[{0}]", i));
CustomBoundColumn customBoundColumn = new CustomBoundColumn();
customBoundColumn.Header = "Col" + i;
customBoundColumn.Binding = binding;
customBoundColumn.TemplateName = "CustomTemplate";
TestControlDataGrid.TestDataGrid.Columns.Add(customBoundColumn);
}
每列都是CustomBoundColumn类型,它派生自DataGridBoundColumn
public class CustomBoundColumn : DataGridBoundColumn
{
public string TemplateName { get; set; }
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var binding = new Binding(((Binding)Binding).Path.Path);
binding.Source = dataItem;
var content = new ContentControl();
content.ContentTemplate = (DataTemplate)cell.FindResource(TemplateName);
content.SetBinding(ContentControl.ContentProperty, binding);
return content;
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
return GenerateElement(cell, dataItem);
}
}
我现在想使用DataTemplateSelector来允许每一行使用不同的DataTemplate,而不是仅使用第一个片段中显示的“CustomTemplate”。我怎么能这样做?
答案 0 :(得分:4)
对不起,迟到了。我相信解决方案非常简单,只需在“CustomTemplate”中放置ContentPresenter
:
<DataTemplate x:Key="CustomTemplate">
<ContentPresenter Content="{Binding}"
ContentTemplateSelector="{StaticResource myTemplateSelector}">
</ContentPresenter>
</DataTemplate>
你去吧!您现在可以使用DataTemplateSelector
。一个很好的例子here。
答案 1 :(得分:0)
最后我换了
content.ContentTemplate = (DataTemplate)cell.FindResource(TemplateName);
与
content.ContentTemplateSelector = (DataTemplateSelector)cell.FindResource("templateSelector");
其中'templateSelector'是在XAML代码中声明为静态资源的DataTemplateSelector的键。这很好。
答案 2 :(得分:0)