设置 WPF DataGridCell ControlTemplate 后无法编辑

Cannot edit after setting WPF DataGridCell ControlTemplate

我正在自定义 WPF DataGridCell 样式,但是一旦完成此双击编辑就不再有效。我也试过手动调用 myDataGrid.BeginEdit,但似乎没有任何反应。这是类似于我的代码:

<Style x:Key="MyCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
    <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate>
                 <Border>
                     <TextBlock />
                 </Border>
             </ControlTemplate>
         </Setter.Value>
    </Setter>
</Style>

我假设问题是因为我覆盖了 ControlTemplate,所以编辑器不再存在?如果是这样的话,他们是我可以使用默认编辑器对其进行排序的一种方式吗?

通常,您应该避免重写 ControlTemplates,除非您确实需要对控件的功能或布局进行实质性更改(或者如果您自己构建控件)。您通常可以使用 DataTemplates 来完成您需要的操作,它保持底层控件不变,但自定义数据的显示方式。

对于 DataGrid,有一种特殊类型的列类型:DataGridTemplateColumn。这是一个如何使用它的简单示例:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <!--This is used when the cell is being displayed normally-->
                <DataTemplate>
                    <TextBlock Text="{Binding SomePropertyOfYourRow}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <!--This is used when the cell is being edited (e.g. after double-click)-->
                <DataTemplate>
                    <TextBox Text="{Binding SomePropertyOfYourRow}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

您可以轻松地将自定义 TextBlock 放入 CellTemplate 中,它将用于显示该单元格的内容。

I'm using a subclassed TextBlock which sets different foreground colours for individual words in the content string. I couldn't figure out how to do that without replacing the ControlTemplate.

而不是创建自定义 ControlTemplate ,您应该创建自定义列类型并将 GenerateElement 方法覆盖为 return 自定义类型的实例:

public class CustomColumn : DataGridTextColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        return new YourCustomTextBlock();
    }
}