3

我有一个带有动态数据(自定义 DataRows 的集合)的 DataGrid,它是从服务器获取的。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 作为我的选择器的内容(不明白为什么,因为该列被绑定在行的一项上)并且我的转换器没有被调用。整个数据行是默认的 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)。更改内容后调用转换器。如何创建模板选择器,它将根据我的绑定数据选择模板(调用转换器后)?

4

1 回答 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>
于 2012-12-14T13:21:43.103 回答