2012-01-15 40 views
0

我在通过XAML创建的应用程序中有一个WPF TabControl对象。也是通过XAML创建的,是一个包含DataGrid的TabItem。在我的应用程序中,用户可以为该TabControl创建新的Tabs。发生这种情况时,将为该新TabItem创建一个DataGrid。所以应用程序最终可能会包含多个带有DataGrid的TabItem,尽管我只通过XAML创建了一个带有DataGrid的TabItem。如果在TabControl上编辑和切换选项卡,DataGrid的新行消失

我看到一个问题,如果用户想要在DataGrid中添加新行,但随后决定切换到不同的Tab,DataGrid在用户返回到该Tab时缺少新行。那么就不可能向DataGrid添加新行。奇怪的是,这个问题只发生在为动态TabItems动态创建的DataGrid上。所以这个问题在通过XAML创建的DataGrid中不存在。有没有人看过这个问题?

回答

0

发现这里有一个问题与Stack Overflow中的这个问题非常相似。这是一个链接。接受的答案是为我解决问题的答案。

TabControl with Datagrid

1

看来,你需要改变标签之前提交网格中的所有编辑。这是一个很好的解决方法,我发现它非常有用:

// 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)); 
}