【发布时间】:2015-03-25 23:01:37
【问题描述】:
我在 WPF 中有一个带有 DataGridTextColum 和 DataGridTemplateColum 的数据网格。
<DataGridTextColumn Width="4*" IsReadOnly="True" x:Name="dataGridColumnDescription"
Header="Description" Binding="{Binding Description}">
</DataGridTextColumn>
<DataGridTemplateColumn CellStyle="{StaticResource CellEditing}" IsReadOnly="False" Width="*" Header="Value"
CellEditingTemplateSelector="{StaticResource myCellEditingTemplateSelectorValue}"
CellTemplateSelector="{StaticResource myCellTemplateSelectorValue}">
</DataGridTemplateColumn>
CellTemplateSelectors 返回一个 DataTemplate 和一个用于 Celltemplate 的 TextBlock。用于单元格编辑的文本框!
<DataTemplate x:Key="dGridStringValueTemplate">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Path=Value}"/>
</DataTemplate>
<DataTemplate x:Key="dGridStringValueTemplateEditing">
<TextBox TextAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderThickness="1" Text="{Binding Path=Value, UpdateSourceTrigger=LostFocus}"/>
</DataTemplate>
现在我想在 DataGridCell 获得焦点时自动聚焦 TextBox。用户应该能够在不双击单元格的情况下编辑 TextBox 内容。
我找到了这篇文章:
DataGrid Tips & Tricks: Single-Click Editing 在哪里可以获得当前 DataGridCell,但如何访问内容以使文本框获得焦点以编辑内容?
这是我的风格:
<Style x:Key="CellEditing" TargetType="{x:Type DataGridCell}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="myDataGridMain_PreviewMouseLeftButtonDown"></EventSetter>
</Style>
这是我的事件处理程序:
private void myDataGridMain_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = sender as DataGridCell; // cell ist not null
DataGridTemplateColumn col = cell.Column as DataGridTemplateColumn; //col is not null
DataTemplate template = col.CellTemplate; //this is null
}
如何使用该事件处理程序获取文本框?
【问题讨论】:
-
当您希望您的网格始终可编辑时,为什么要编辑模板?只需在其中添加带有文本框的单元格模板并更改文本框本身的样式,这样您就不必编写焦点内容
-
@WPFKK 这行不通,因为数据网格不会切换到“编辑模式”,因此输入值不会绑定到源。