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