2011-09-26 85 views
2

我有一個DataGrid與動態數據(自定義DataRows的集合),我從服務器獲得。 DataRow中有一個索引和屬性數據返回整個數據行的綁定(你會看到如下圖)DataGridCell內容模板選擇器Silverlight

我以這樣的方式創建一個DataGrid中的每一列:

DataGridTextColumn column = new DataGridTextColumn();  
Binding binding = new Binding("Data[" + i.ToString() + "]"); 
binding.Mode = BindingMode.TwoWay; 
binding.Converter = _dataContextSelector; 
binding.ConverterParameter = dataColumn; 
column.Binding = binding; 

我需要什麼要做:我需要根據不同的方式顯示DataGridCells的內容,根據轉換器返回的數據。
我寫的模板選擇器(它繼承ContentControl中),並把它放在DataGridCell的財產的ContentTemplate以這樣的方式:

<Style TargetType="sdk:DataGridCell"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <view:DataGridCellTemplateSelector Content="{Binding}" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

在這種情況下,我把整個的DataRow爲我選擇的內容(不能不知爲什麼,因爲列被綁定在行的一個項目上),我的轉換器不被調用。整個datarow是默認的DataContext,所以我猜想,在這種情況下,我的代碼隱藏綁定是無視的。
所以我想我的模板選擇付諸DataGridCell的控件模板:

<Style TargetType="sdk:DataGridCell"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="sdk:DataGridCell"> 
       <view:DataGridCellTemplateSelector Content="{TemplateBinding Content}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

但在這種情況下,我有TextBlock的空句話作爲我的選擇(震驚)的內容。轉換器在內容改變後被調用。 如何創建模板選擇器,它將根據我的綁定數據(在調用轉換器後)選擇模板?

回答

0
  • 考慮使用隱式數據模板,而不是自定義模板選擇。
  • 創建自定義DataGridBoundColumn並覆蓋GenerateElement。
  • 在GenerateElement中,返回一個ContentControl。您必須使用自定義列的Binding屬性來綁定該ContentControl的Content屬性。
    • 如果使用隱式數據模板,你在這一點上就大功告成了。
    • 如果使用您自己的DataGridCellTemplateSelector,那麼只需使用它而不是上面提到的普通ContentControl。

隱式數據模板看起來像(注意,他們是沒有資源的x:關鍵):

<UserControl.Resources> 
    <DataTemplate DataType="ViewModel:Contact"> 
     <StackPanel> 
      <TextBlock Text="{Binding Name}"/> 
      <TextBlock Text="{Binding City}"/> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources>