2012-01-15 2 views
0

У меня есть объект WPC TabControl в моем приложении, созданный с помощью XAML. Также создается через XAML, это один TabItem, который содержит DataGrid. В моем приложении пользователь может создавать новые вкладки для этого TabControl. Когда это произойдет, для этого нового TabItem создается DataGrid. Таким образом, приложение может содержать несколько TabItems с DataGrids, хотя я только создаю один TabItem с DataGrid через XAML.Новая строка DataGrid исчезает, если редактирование и переключение вкладок на TabControl

У меня возникла проблема: если пользователь хочет добавить новую строку в DataGrid, но затем решит переключиться на другую вкладку, DataGrid пропускает новую строку, когда пользователь вернется к этой вкладке. Таким образом, невозможно добавить новые строки в DataGrid. Странно то, что эта проблема возникает только в DataGrids, которые динамически создаются для динамических TabItems. Таким образом, эта проблема отсутствует в DataGrid, которая была создана через XAML. Кто-нибудь видел эту проблему раньше?

ответ

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