Новая строка DataGrid исчезает, если редактирование и переключение вкладок на TabControl - PullRequest
0 голосов
/ 16 января 2012

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

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Похоже, что вам нужно зафиксировать все ваши изменения в сетке перед сменой вкладок.Вот хороший обходной путь, который я нашел весьма полезным:

// 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));
}
0 голосов
/ 16 января 2012

Оказывается, есть вопрос, который был очень похож на этот здесь, в Переполнении стека. Вот ссылка на него. Принятый ответ - тот, который решил проблему для меня.

TabControl с датагридом

...