gpt4 book ai didi

c# - WPF DataGrid Cell 不离开编辑模式

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:14 25 4
gpt4 key购买 nike

我在使用 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);
}
}

有人看到这里出了什么问题吗?你能重现这个问题吗?任何帮助将不胜感激。

谢谢,巴努

最佳答案

DataGrid XAML 定义 100% 正确。问题一定出在代码后面。我最好的猜测是 CurrentCellChanged。它可以提高两倍。首先是当您离开一个单元格时,其次是当您选择一个新单元格时。如果是这种情况,您会将失去焦点的单元格放回编辑模式,因为您没有检查事件的条件。

您应该能够通过简单的调试来验证这一点 - 在
放置一个断点((DataGrid)sender).BeginEdit() 并计算它被调用的次数。

我个人将以下代码用于 BeginEdit,它运行良好:

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
if (e.AddedCells.Count > 0 && !this.dataGrid.IsReadOnly)
{
this.dataGrid.BeginEdit();
}
}

关于c# - WPF DataGrid Cell 不离开编辑模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com