我在使用WPF DataGrid时遇到了一个奇怪的问题。当你点击第一个单元格,输入值然后按Tab键转移到下一个单元格时,第一个单元格没有退出编辑模式。我已经使用下面简化版的模板重现了这个问题:
<DataGrid Name="grid" HorizontalAlignment="Stretch" ItemsSource="{Binding Persons}" Margin="0,10,0,0" VerticalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="FirstName">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding FirstName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding FirstName}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="LastName">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding LastName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding LastName}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Age">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Age}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Age}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
虚拟类的定义如下:
虚拟类的定义如下:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
代码背后是:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
Persons = new ObservableCollection<Person>();
this.grid.CurrentCellChanged += grid_CurrentCellChanged;
this.grid.PreparingCellForEdit += grid_PreparingCellForEdit;
}
void grid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.EditingElement != null)
SetFocusToTextBox(e.EditingElement);
}
void grid_CurrentCellChanged(object sender, EventArgs e)
{
((DataGrid)sender).BeginEdit();
}
public ObservableCollection<Person> Persons { get; set; }
void SetFocusToTextBox(object obj)
{
// Get all children and examine if the child is a TextBox
object obChild;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj as DependencyObject); i++)
{
obChild = VisualTreeHelper.GetChild(obj as DependencyObject, i);
if (obChild is TextBox)
{
((TextBox)obChild).Focus();
break;
}
else
SetFocusToTextBox(obChild);
}
}
有人看出问题了吗?你能重现这个问题吗?任何帮助都将不胜感激。
谢谢, Bhanu