Есть задача, отображения коллекции данных отфильтрованных и разделённых на 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
теперь XAML:
Элемент описывающий меню с выбором я сделал в качестве ListBox
Теперь сам ContentControl. ContentControl сам подберет нужный шаблон представления в зависимости от типа привязанного элемента свойству Content
P.S. Ваша реализация со сменой контролов через Visibility имеет право жить. Так как, при смене Visibility не происходит повторно отрисовка контрола, в отличие от ContentControl при смене Content'a.
Такое решение я применяю когда контрол сложный, содержит много дочерних элементов.
Комментариев нет:
Отправить комментарий