2011-10-01 184 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 –

相關問題