Обработка свойства видимости WPF TabItems

Я читал о Visibility.Collapsed для TabItems. Когда для Visibility установлено значение Collapsed, заголовок TabItem скрыт, но содержимое остается видимым.

Я также пробовал следующий подход, упомянутый в здесь, но не повезло.

Есть ли способ скрыть содержимое внутри TabItems, а также выбрать видимую вкладку.


person aioracle    schedule 04.03.2013    source источник
comment
Вам ничего из этого не нужно. Концептуально TabControl — это просто графическое представление ObservableCollection<ViewModel>, где каждая модель представления представлена ​​элементом вкладки, и в данный момент времени существует только 1 SelectedItem.   -  person Federico Berasategui    schedule 04.03.2013


Ответы (2)


Вам ничего из этого не нужно. Концептуально TabControl — это просто графическое представление ObservableCollection<ViewModel>, где каждая модель представления представлена ​​элементом вкладки, и в данный момент времени существует только 1 SelectedItem:

<Window x:Class="WpfApplication4.Window12"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window12" Height="300" Width="300">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
    </Window.Resources>
        <TabControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                    <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource BoolToVisibilityConverter}}"/>
                    <Setter Property="Header" Value="{Binding Title}"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
</Window>

Код позади:

using System.Windows;
using BaseFramework.MVVM;
using System.Collections.ObjectModel;

namespace WpfApplication4
{
    public partial class Window12 : Window
    {
        public Window12()
        {
            InitializeComponent();
            DataContext = new TabbedViewModel()
                          {
                              Items =
                                  {
                                      new TabViewModel() {Title = "Tab #1", IsEnabled = true, IsVisible = true},
                                      new TabViewModel() {Title = "Tab #2", IsEnabled = false, IsVisible = true},
                                      new TabViewModel() {Title = "Tab #3", IsEnabled = true, IsVisible = false},
                                  }
                          };
        }
    }

ViewModel:

    public class TabbedViewModel: ViewModelBase
    {
        private ObservableCollection<TabViewModel> _items;
        public ObservableCollection<TabViewModel> Items
        {
            get { return _items ?? (_items = new ObservableCollection<TabViewModel>()); }
        }

        private ViewModelBase _selectedItem;
        public ViewModelBase SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                NotifyPropertyChange(() => SelectedItem);
            }
        }
    }

    public class TabViewModel: ViewModelBase
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                NotifyPropertyChange(() => Title);
            }
        }

        private bool _isEnabled;
        public bool IsEnabled
        {
            get { return _isEnabled; }
            set
            {
                _isEnabled = value;
                NotifyPropertyChange(() => IsEnabled);
            }
        }

        private bool _isVisible;
        public bool IsVisible
        {
            get { return _isVisible; }
            set
            {
                _isVisible = value;
                NotifyPropertyChange(() => IsVisible);
            }
        }
    }
}

Тогда это просто вопрос наследования TabViewModel для каждой из ваших вкладок (создание соответствующей логики внутри каждой) и правильного DataTemplate для каждого из этих производных классов в app.xaml или что-то в этом роде.

Всякий раз, когда вы хотите удалить элемент вкладки из представления, вместо того, чтобы манипулировать представлением, вы манипулируете ViewModel. это подход WPF для всего. Он упрощает все, устраняя необходимость манипулировать сложными объектами (элементами пользовательского интерфейса) в коде. Всякий раз, когда вы устанавливаете

TabbedViewModel.SelectedItem.IsVisible = false;, убедитесь, что вы также сделали:

TabbedViewModel.SelectedItem = TabbedViewModel.Items.First(x => x.IsVisible && x.IsEnabled);

Это не позволит вам когда-либо попасть в случай наличия невидимого элемента вкладки в качестве выбранного элемента.

person Federico Berasategui    schedule 04.03.2013
comment
Спасибо. Я буду работать над этим и обновлять. Код кажется тем, что я ищу. - person aioracle; 05.03.2013

Привет, просто добавьте и удалите TabItems из TabControl вместо настройки видимости. Есть еще одна проблема с включением и выключением видимости, и это исключение, такое как Out of index, когда вы прокручиваете, сворачиваете или изменяете размер TabControl.

person yo chauhan    schedule 04.03.2013