DataGridCell内容模板选择器Silverlight

DataGridCell内容模板选择器Silverlight,silverlight,datagridcell,contenttemplateselector,Silverlight,Datagridcell,Contenttemplateselector,我有一个带有动态数据(自定义数据行的集合)的DataGrid,这是我从服务器获得的。DataRow有一个索引器和一个属性数据,返回绑定的整个数据行(如下所示) 我以以下方式创建DataGrid的每一列: DataGridTextColumn column = new DataGridTextColumn(); Binding binding = new Binding("Data[" + i.ToString() + "]"); binding.Mode = BindingMode.Tw

我有一个带有动态数据(自定义数据行的集合)的DataGrid,这是我从服务器获得的。DataRow有一个索引器和一个属性数据,返回绑定的整个数据行(如下所示)

我以以下方式创建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;
<Style TargetType="sdk:DataGridCell">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <view:DataGridCellTemplateSelector Content="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
我需要做什么:我需要根据转换器返回的数据以不同的方式显示DataGridCells的内容
我编写了模板选择器(它继承了ContentControl),并以如下方式将其放入DataGridCell的ContentTemplate属性中:

DataGridTextColumn column = new DataGridTextColumn();    
Binding binding = new Binding("Data[" + i.ToString() + "]");
binding.Mode = BindingMode.TwoWay;
binding.Converter = _dataContextSelector;
binding.ConverterParameter = dataColumn;
column.Binding = binding;
<Style TargetType="sdk:DataGridCell">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <view:DataGridCellTemplateSelector Content="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

在本例中,我将整个DataRow作为选择器的内容(无法理解为什么,因为该列绑定在该行的一个项目上),并且没有调用我的转换器。整个datarow是默认的DataContext,因此我想,在本例中,我的代码隐藏绑定只是被忽略。
因此,我尝试将模板选择器放入DataGridCell的ControlTemplate:

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

但在本例中,我将带有空文本的TextBlock作为选择器的内容(SHOCKED)。内容更改后调用转换器。 如何创建模板选择器,该选择器将根据我的绑定数据(在调用转换器后)选择模板?

  • 考虑使用隐式数据模板而不是自定义模板选择器
  • 创建自定义DataGridBoundColumn并重写GenerateElement
  • 在GenerateElement中,返回ContentControl。必须使用自定义列的Binding属性绑定该ContentControl的Content属性。
    • 如果使用隐式数据模板,则到此为止
    • 如果使用您自己的DataGridCellTemplateSelector,那么只需使用它而不是上面提到的普通ContentControl
隐式数据模板如下所示(请注意,它们是没有x:Key的资源):