我有一个dataGrid。当任何行的第一个单元格(包含文本框的模板列)被聚焦,并且如果用户没有输入任何文本并尝试移动到另一个单元格或数据网格外的任何控件时,他应该被强制输入数据失去焦点前的细胞。如果他不想在该单元格中输入任何数据,那么他应该按照他的选择按 Enter 或 Esc 。任何人都可以帮助我实现这种行为吗?
答案 0 :(得分:0)
我可以想到两种方法来实现这个目标:
<强>首先强>
您可以使用DataGridTemplateColumn
并将模板设置为Textbox
。此文本框包含您可以使用的PreviewLostKeyboardFocus
事件。将Handled
设置为true可防止Textbox
失去焦点。
示例:
<DataGrid CanUserAddRows="True" ItemsSource="{Binding MyItems}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="header">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding DisplayedName}" PreviewLostKeyboardFocus="OnPreviewLostKeyboardFocus" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<强>第二强>
您还可以向Style
添加DataGrid
。此样式设置所有单元格的PreviewLostKeyboardFocus
事件:
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<EventSetter Event="PreviewLostKeyboardFocus" Handler="OnPreviewLostKeyboardFocus" />
</Style>
</DataGrid.Resources>
在事件处理程序中,检查单元格是否在正确的列中,然后将Handled
设置为true:
public void OnPreviewLostKeyboardFocus(object sender, RoutedEventArgs e)
{
if ((sender as DataGridCell).Column.Header.ToString() == "The column I'm looking for")
{
e.Handled = true;
}
}