7

について読んVisibility.CollapsedでいTabItemsます。Visibilityが に設定されている場合CollapsedTabItemヘッダーは非表示になりますが、コンテンツは引き続き表示されます。

hereに記載されている次のアプローチも試しましたが、うまくいきません。

内部のコンテンツTabItemsを非表示にして、表示されているタブを選択する方法はありますか。

4

2 に答える 2

11

あなたはそれのどれも必要ありません。概念的には、aTabControlは、の単なるグラフィック表現でありObservableCollection<ViewModel>、各ビューモデルはタブアイテムで表されSelectedItem、特定の時間に1つしかありません。

<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アプローチです。コード内の複雑なオブジェクト(UI要素)を操作する必要がなくなるため、すべてが簡素化されます。設定するたびに

TabbedViewModel.SelectedItem.IsVisible = false;、次のことも確認してください。

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

これにより、選択したアイテムとして非表示のタブアイテムが存在する場合に陥ることがなくなります。

于 2013-03-04T16:25:46.170 に答える
1

こんにちは、可視性を設定する代わりに、TabControl から TabItems を追加および削除するだけです。可視性のオンとオフの切り替えにはもう 1 つの問題があり、TabControl をスクロール、最小化、またはサイズ変更すると、Out of index などの例外が発生します。

于 2013-03-04T16:07:43.710 に答える