2011-10-01 144 views
2

我遵循简单的方法here并有一个DataGrid动态生成列允许DataTemplates动态使用和绑定。如何将DataTemplateSelector与DataGridBoundColumn一起使用?

 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

一个不同的DataTemplate取决于什么? – Natxo

+0

根据在该行上显示的数据类型(我填充了一个基类列表,但每行实际上可能是一个不同的派生类,我想在DataTemplate中使用一些额外的属性) – Caustix

回答

0

在端我取代

content.ContentTemplate = (DataTemplate)cell.FindResource(TemplateName); 

content.ContentTemplateSelector = (DataTemplateSelector)cell.FindResource("templateSelector"); 

其中 'templateSelector' 是DataTemplateSelector的键声明为静态资源在XAML代码。这工作正常。

4

对不起,迟到的答案。我认为,解决办法很简单,只需将一个ContentPresenter在“CustomTemplate”:

<DataTemplate x:Key="CustomTemplate"> 
    <ContentPresenter Content="{Binding}" 
         ContentTemplateSelector="{StaticResource myTemplateSelector}"> 
    </ContentPresenter> 
</DataTemplate> 

而且你去那里!您现在可以使用DataTemplateSelector。一个很好的例子here

+0

我实现了一个类似的东西,无需使用ContentPresenter。尽管如此。 +1为输入 – Caustix

+0

您的链接已损坏,您能否找到另一个示例并粘贴代码? – VcDeveloper

+0

@VcDeveloper我改变了它,它应该是够好的。 – Natxo

0

我做了一个自定义列类,它将DataGridBoundColumn和DataGridTemplateColumn结合在一起。

您可以在该列上设置绑定和模板。

这里的源: gist

+0

您是如何实现编辑功能的?对于我来说,只要开始编辑,应用程序就会崩溃,“双向绑定需要Path或XPath.'。 – Gman

+0

看看CellEditungTemplate –

相关问题