В программе используется 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()
}
Результат:
При этом геттеры срабатывают только по разу, что можно видеть в логе.
Комментариев нет:
Отправить комментарий