如何强制用户在DataGridCell中输入数据

时间:2015-05-07 10:52:21

标签: c# wpf datagrid

我有一个dataGrid。当任何行的第一个单元格(包含文本框的模板列)被聚焦,并且如果用户没有输入任何文本并尝试移动到另一个单元格或数据网格外的任何控件时,他应该被强制输入数据失去焦点前的细胞。如果他不想在该单元格中输入任何数据,那么他应该按照他的选择按 Enter Esc 。任何人都可以帮助我实现这种行为吗?

1 个答案:

答案 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;
    }
}