Страницы

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

вторник, 5 марта 2019 г.

Динамическая смена ItemsSource в TabControl (Коллекции разных типов)

Есть задача, отображения коллекции данных отфильтрованных и разделённых на 5 вкладок.
Например есть коллекция сериалов и в каждой вкладке либо запланированные к просмотру, либо просмотренные, либо брошенные на середине. Есть также коллекция комиксов, с точно такой же сортировкой по вкладкам. Приложение отображает либо список сериалов, либо список комиксов. У сериалов есть помимо прочего поле "Серии", у комиксов же вместо этого есть поля "Главы" и "Тома". То есть классы для них различаются.
Нужно, чтобы программа работала в одном из двух режимов (либо только для комиксов, либо только для сериалов). Кнопки переключения есть в главном меню.
Вопрос: можно ли подобное реализовать с помощью одного TabControl, при условии следования паттернам MVVM?
Сейчас это реализовано следующим образом:


То есть, я использую 2 TabControl'а и в зависимости от режима отображаю лишь один из них. Не знаю, на сколько правильный такой подход, поэтому и спрашиваю совета у SO.


Ответ

Можно обойтись с использованием ContentControl и заданием DataTemplate для каждого объекта(для сериалов и для комиксов).
Создадим базовый класс представляющий собой родителя для комиксов и сериалов.
public class BaseVM : INotifyPropertyChanged { //какие-то свойства //реализация INotifyPropertyChanged }
Создадим производные классы:
public class MangaVM : BaseVM { public ObservableCollection<тип_комикса> MangaList { get; set; } }
public class AnimeVM : BaseVM { public ObservableCollection<тип_сериала> AnimeList { get; set; } }
public List Entertainments { get; set; } //список который будет в меню выбора public BaseVM SelectedEntertainment { get; set; }//выбранный элемент в зависимости от которого //будет меняться шаблон представления
теперь XAML:




Элемент описывающий меню с выбором я сделал в качестве ListBox

Теперь сам ContentControl. ContentControl сам подберет нужный шаблон представления в зависимости от типа привязанного элемента свойству Content

P.S. Ваша реализация со сменой контролов через Visibility имеет право жить. Так как, при смене Visibility не происходит повторно отрисовка контрола, в отличие от ContentControl при смене Content'a.
Такое решение я применяю когда контрол сложный, содержит много дочерних элементов.

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

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