WPF Tabcontrol(TabItem内容未显示)

时间:2015-09-11 10:37:38

标签: c# wpf mvvm tabcontrol tabitem

我在我的应用程序中实现了带有Closable TabItems的TabControl。为此,我使用的是一个Collection,它填充了MenuItem“Öffne”的SubMenuItems,它们与MainViewModel中的ICommands绑定。

因此,如果我单击MenuItem“打开Tab1”,则会创建选项卡1的标题,但我看不到任何内容。 TabItem的内容在我点击TabItem的标题后显示。但我希望它在“创建”TabItem时直接显示,而无需点击标题。从“X”按钮关闭TabItems工作正常。

我查看了几个示例并尝试了一个ContentTemplate,但它没有用(也许我做错了什么?)。

我希望你能告诉我我做错了什么或给我一个好榜样。 提前谢谢!

以下是我的代码段:

MainWindow.XAML:

<Window.Resources>
<vm:MainViewModel x:Key="viewModel"/>
</Window.Resources>
<TabControl Background="#FFE5E5E5" ItemsSource="{Binding TabControlViews}" SelectedItem="{Binding CurrentTabItem}" Margin="0,21,0,0">
        <TabControl.ItemTemplate>
            <DataTemplate>       
                <DockPanel Width="120">
                    <TextBlock Text="{Binding Header}"/>
                    <Button
                Command="{Binding ParameterizedCommand, Source={StaticResource viewModel}}"
                CommandParameter="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"
                Content="X"
                Cursor="Hand"
                DockPanel.Dock="Right"
                Focusable="False"
                FontFamily="Courier"
                FontSize="9"
                FontWeight="Bold"
                Margin="0,1,0,0"
                Padding="0"
                VerticalContentAlignment="Bottom"
                Width="16" Height="16" />
                    <ContentPresenter
                Content="{Binding Path=DisplayName}"
                VerticalAlignment="Center" />
                </DockPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <!--<TabControl.ContentTemplate>
            <DataTemplate>                   
            </DataTemplate>
        </TabControl.ContentTemplate>-->
        <TabControl.Resources>
            <DataTemplate x:Name="test" DataType="{x:Type vm:MenueVM}">
                <cu:MenueSearch/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:FieldPointsVM}">
                <cu:FieldPointsSearch/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:DataTransferVM}">
                <cu:DataTransfer/>
            </DataTemplate>
        </TabControl.Resources>
</TabControl>

MainWindow.cs:

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        var vm = (MainViewModel)Resources["viewModel"];
        this.DataContext = vm;
    }
}

MainViewModel.cs:

    public MainViewModel()
    {

        TabControlViews = new ObservableCollection<BaseViewModel>();
        _menueVM = new MenueVM("Menüpunkte", "Menue");
        _fieldVM = new FieldPointsVM("Feldpunkte", "FieldPoint");
        _dataVM = new DataTransferVM("DatenTransfer", "DataTransfer");
        ParameterizedCommand = new RelayCommand(DoParameterizedCommand);
    }

    private void DoParameterizedCommand(object parameter)
    {
        if (parameter.ToString() == "App.ViewModel.MenueVM")
        {
            TabControlViews.Remove(_menueVM);
        }
        else if (parameter.ToString() == "App.ViewModel.FieldPointsVM")
        {
            TabControlViews.Remove(_fieldVM);
        }
        else if (parameter.ToString() == "App.ViewModel.DataTransfer")
        {
            TabControlViews.Remove(_dataVM);
        }
    }

    private ICommand _parameterizedCommand;
    public ICommand ParameterizedCommand
    {
        get 
        { 
            return _parameterizedCommand; 
        }
        set
        {
            _parameterizedCommand = value;
        }
    }

    private TabItem _propCurrentTabItem;
    public TabItem CurrentTabItem
    {
        get
        {
            return _propCurrentTabItem;
        }
        set
        {
            _propCurrentTabItem = value;
        }
    }

    private ObservableCollection<BaseViewModel> _TabControlViews = new ObservableCollection<BaseViewModel>();
    public ObservableCollection<BaseViewModel> TabControlViews
    {
        get
        {
            return _TabControlViews;
        }
        set
        {
            _TabControlViews = value;
            OnPropertyChanged();
        }
    }

    public ICommand OpenMenupunkteCommand
    {
        get
        {
            return new BaseCommand(OpenMenuPunkte);
        }
    }

    public ICommand OpenFeldpunkteCommand
    {
        get
        {
            return new BaseCommand(OpenFeldpunkte);
        }
    }

    public ICommand OpenDataTransferCommand
    {
        get
        {
            return new BaseCommand(OpenDataTransfer);
        }
    }
   private void OpenMenuPunkte()
    {
        if (!TabControlViews.Contains(_menueVM))
        {
            TabControlViews.Add(_menueVM);
        }

    }

    private void OpenFeldpunkte()
    {
        if (!TabControlViews.Contains(_fieldVM))
        {
            TabControlViews.Add(_fieldVM);
        }
    }

    private void OpenDataTransfer()
    {
        if (!TabControlViews.Contains(_dataVM))
        {
            TabControlViews.Add(_dataVM);
        }
    }

MenueVM.cs

public class MenueVM : BaseViewModel
{

    public MenueVM()
    {
       //Here are some actions done for Data, but I think they are unimportant for this question
    }

    public MenueVM(string header, string content)
    {
        Header = header;
        Content = content;
    }

    private string _header;
    public string Header
    {
        get
        {
            return _header;
        }
        set
        {
            _header = value;
        }
    }

1 个答案:

答案 0 :(得分:1)

还有时间发表回答吗? 试试这个:

XAML:

<TabControl ItemsSource="{Binding....}" IsSynchronizedWithCurrentItem="True">
    <!-- style, template, ... -->
</TabControl>

CS:

//Adding your viewModel to your ObservableCollection<> TabControlViews
TabControlViews.Add(_viewModelToAdd);
ICollectionView collectionView = CollectionViewSource.GetDefaultView(TabControlViews);
if (collectionView != null)
{
    collectionView.MoveCurrentTo(_viewModelToAdd);
    //And this is because you don't want your tabItem to be selected :
    collectionView.MoveCurrentToPrevious();
}

在可下载的DemoMVVMApp中找到:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030

我也花了很多时间来解决这个问题...; - )