繁体   English   中英

WPF Tabcontrol(TabItem 内容未出现)

[英]WPF Tabcontrol (TabItem Content is not appearing)

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

因此,如果我单击 MenuItem“Open Tab1”,则会创建 Tab 1 的 header,但我看不到任何内容。 在我点击 TabItem 的 Header 之后显示 TabItem 的内容。 但我希望在“创建”TabItem 时直接显示它,而无需单击 header。从“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>

主窗口.cs:

public partial class MainWindow : Window
{

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

主视图模型.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);
        }
    }

菜单VM.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;
        }
    }

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

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/zh-cn/magazine/dd419663.aspx#id0090030

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

问题是您的选项卡已创建,但未被选中。 所以,除了打电话

TabControlViews.Add(_dataVM)

,您还应该更新您的 CurrentTabItem

CurrentTabItem = _dataVM;

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

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

另外,如果你删除了一个 TabItem 并想回到最后一个,你必须调用

CurrentTabItem = TabControlViews.LastOrDefault();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM