数据网格单元格内容模板选择器 Silverlight

3

我有一个DataGrid,其中包含动态数据(自定义DataRow集合),这些数据来自服务器。 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,所以我猜想,在这种情况下,我的code-behind绑定被简单地忽略了。
因此,我尝试将我的模板选择器放置到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。转换器在内容更改后被调用。

我该如何创建模板选择器,根据我的绑定数据(在转换器被调用后)选择模板?

1个回答

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接