DataGridCell内容模板选择器Silverlight

时间:2011-09-26 11:53:46

标签: silverlight datagridcell contenttemplateselector

我有一个DataGrid,其中包含我从服务器获取的动态数据(自定义DataRows的集合)。 DataRow有一个索引器和一个属性Data,它返回绑定的整个数据行(你会在下面看到)

我以这样的方式创建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的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 )。内容更改后调用Converter。 如何创建模板选择器,它将根据我的绑定数据选择模板(调用转换器后)?

1 个答案:

答案 0 :(得分:0)

  • 考虑使用隐式数据模板而不是自定义模板选择器。
  • 创建自定义DataGridBoundColumn并覆盖GenerateElement。
  • 在GenerateElement中,返回ContentControl。您必须使用自定义列的Binding属性绑定该ContentControl的Content属性。
    • 如果使用隐式数据模板,则此时已完成。
    • 如果使用自己的DataGridCellTemplateSelector,只需使用它而不是上面提到的纯ContentControl。

隐式数据模板看起来像那样(注意,它们是没有x:Key的资源):

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