DataGrid';如果在TabControl上编辑和切换选项卡,则新行将消失

本文关键字:选项 消失 新行 如果 编辑 TabControl DataGrid | 更新日期: 2023-09-27 18:20:18

我的应用程序中有一个通过XAML创建的WPF TabControl对象。也是通过XAML创建的,是一个包含DataGrid的TabItem。在我的应用程序中,用户可以为该TabControl创建新的选项卡。当这种情况发生时,将为该新TabItem创建一个DataGrid。因此,即使我通过XAML只创建了一个带有DataGrid的TabItem,应用程序最终也可能包含多个带有DataGrids的TabItem。

我看到一个问题,如果用户想在DataGrid中添加新行,但随后决定切换到另一个选项卡,则当用户返回到该选项卡时,DataGrid将丢失新行。因此,无法向DataGrid添加新行。奇怪的是,这个问题只发生在为动态TabItems动态创建的DataGrids上。因此,通过XAML创建的DataGrid中不存在此问题。以前有人看过这个问题吗?

DataGrid';如果在TabControl上编辑和切换选项卡,则新行将消失

在更改选项卡之前,似乎需要提交网格中的所有编辑。这里有一个很好的变通方法,我觉得很有用:

// PreviewMouseDown event handler on the TabControl
private void TabControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (IsUnderTabHeader(e.OriginalSource as DependencyObject))
        CommitTables(yourTabControl);
}
private bool IsUnderTabHeader(DependencyObject control)
{
    if (control is TabItem)
        return true;
    DependencyObject parent = VisualTreeHelper.GetParent(control);
    if (parent == null)
        return false;
    return IsUnderTabHeader(parent);
}
private void CommitTables(DependencyObject control)
{
    if (control is DataGrid)
    {
        DataGrid grid = control as DataGrid;
        grid.CommitEdit(DataGridEditingUnit.Row, true);
        return;
    }
    int childrenCount = VisualTreeHelper.GetChildrenCount(control);
    for (int childIndex = 0; childIndex < childrenCount; childIndex++)
        CommitTables(VisualTreeHelper.GetChild(control, childIndex));
}

事实证明,有一个问题与Stack Overflow上的这个问题非常相似。这里有一个链接。公认的答案是为我解决问题的答案。

TabControl与Datagrid