Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Повторная установка свойств в DataTemplate при смене активной вкладки в TabControl

В программе используется TabControl и каждая его вкладка представлена юзерконтролом с таблицей DataGrid.
Когда активная вкладка меняется, то свойство ItemsSource каждый раз устанавливается заново, что приводит к таким неприятностям как потеря предыдущего состояния полосы прокрутки и всех выделенных строк в таблице, да и просто приходится каждый раз ожидать какое-то время для подгрузки данных.
В коде при этом ничего не изменяется.
В чем проблема?
MainWindow:

UserControl:


Ответ

Дело в том, что TabControl старается использовать один и тот же контрол для контента всех табов. В связи с этим, конечно, визуальное состояние теряется.
Я для себя эту проблему решал так:
У TabControl убрал контент, оставил только табы. Поскольку стандартный TabControl оставляет место, пришлось добавить отрицательный отступ снизу. Под TabControl'ом расположил Grid, в котором хранились все View для контента табов, показ нужного проводился через переключение Visibility. Чтобы не делать это вручную, я использовал стандартный трюк с ItemsControl'ом ListBox'ом.
Вот полный код:

VM-классы:
class VM { } class VM1 : VM { public string Header { get { Debug.Print("VM1.Header.get"); return "Что-то"; } } public string Content { get { Debug.Print("VM1.Content.get"); return "В лесу родилась ёлочка"; } } } class VM2 : VM { public string Header { get { Debug.Print("VM2.Header.get"); return "Кто-то"; } } public string Content { get { Debug.Print("VM2.Content.get"); return "И Гена-крокодил"; } } }
DataContext
new VM[] { new VM1(), new VM2() }
Результат:

При этом геттеры срабатывают только по разу, что можно видеть в логе.

Комментариев нет:

Отправить комментарий