设置 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,所以编辑器不再存在?如果是这样的话,他们是我可以使用默认编辑器对其进行排序的一种方式吗?
通常,您应该避免重写 ControlTemplate
s,除非您确实需要对控件的功能或布局进行实质性更改(或者如果您自己构建控件)。您通常可以使用 DataTemplate
s 来完成您需要的操作,它保持底层控件不变,但自定义数据的显示方式。
对于 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();
}
}
我正在自定义 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,所以编辑器不再存在?如果是这样的话,他们是我可以使用默认编辑器对其进行排序的一种方式吗?
通常,您应该避免重写 ControlTemplate
s,除非您确实需要对控件的功能或布局进行实质性更改(或者如果您自己构建控件)。您通常可以使用 DataTemplate
s 来完成您需要的操作,它保持底层控件不变,但自定义数据的显示方式。
对于 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();
}
}