2012-01-15 56 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)); 
}