WPF表控件(表项内容没有出现)

本文关键字:控件 WPF | 更新日期: 2023-09-27 18:12:22

我在我的应用程序中实现了一个具有可关闭TabItems的TabControl。为此,我使用了一个集合,我用MenuItem "Öffne"的SubMenuItems填充,它被绑定到MainViewModel中的iccommands。

所以如果我点击菜单项"打开Tab1",那么Tab1的标题被创建,但我看不到任何内容。单击TabItem的Header后显示TabItem的内容。但是我希望在TabItem"创建"时直接显示它,而不需要单击标题。从"X"按钮关闭TabItems可以正常工作。

我看了几个例子,并尝试了一个ContentTemplate,但它没有工作(也许我做错了什么?)

我希望你能告诉我我做错了什么或给我一个好的例子。提前感谢!

下面是我的代码片段:

主窗口。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;
        }
    }

WPF表控件(表项内容没有出现)

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

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

我也花了大量的时间来解决这个问题…: -)

问题是您的选项卡已经创建,但它没有被选中。所以,除了调用

TabControlViews.Add(_dataVM)

,你也应该更新CurrentTabItem

CurrentTabItem = _dataVM;

并将TabControl SelectedItem属性绑定到CurrentTabItem,如下所示:

<TabControl ItemsSource="{Binding TabControlViews}" SelectedItem="{Binding CurrentTabItem}">

同样,如果你删除了一个TabItem并想要返回到最后一个,你必须调用

CurrentTabItem = TabControlViews.LastOrDefault();