Страницы

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

суббота, 11 января 2020 г.

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

#c_sharp #wpf #xaml #mvvm #binding


Есть задача, отображения коллекции данных отфильтрованных и разделённых на 5 вкладок. 

Например есть коллекция сериалов и в каждой вкладке либо запланированные к просмотру,
либо просмотренные, либо брошенные на середине.
Есть также коллекция комиксов, с точно такой же сортировкой по вкладкам. 
Приложение отображает либо список сериалов, либо список комиксов. 
У сериалов есть помимо прочего поле "Серии", у комиксов же вместо этого есть поля
"Главы" и "Тома". То есть классы для них различаются. 

Нужно, чтобы программа работала в одном из двух режимов (либо только для комиксов,
либо только для сериалов). Кнопки переключения есть в главном меню. 

Вопрос: можно ли подобное реализовать с помощью одного TabControl, при условии следования
паттернам MVVM?

Сейчас это реализовано следующим образом:

    
        
            
                
            
        
        
            
                
                    
                        
                            
                                
                                
                                
                                
                            
                        
                    
                
            
        
    
    
        
            
                
            
        
        
            
                
                    
                        
                            
                                
                                
                                
                                
                                
                            
                        
                    
                
            
        
    




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


Ответы

Ответ 1



Можно обойтись с использованием 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. Такое решение я применяю когда контрол сложный, содержит много дочерних элементов.

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

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