C# 如何隐藏主/默认选项卡(TabControl)上的关闭按钮

C# 如何隐藏主/默认选项卡(TabControl)上的关闭按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个选项卡控件,每个选项卡中都有一个关闭按钮。我想在第一个(默认)选项卡中隐藏关闭按钮。我使用了WPF MVVVM。我的用户界面 这是TabControl的XAML代码: <UserControl x:Class="Money_Transfer_System.Views.TabControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我有一个
选项卡控件
,每个选项卡中都有一个关闭按钮。我想在第一个(默认)选项卡中隐藏关闭按钮。我使用了WPF MVVVM。我的用户界面

这是
TabControl
的XAML代码:

<UserControl x:Class="Money_Transfer_System.Views.TabControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Money_Transfer_System.Views"
              xmlns:ViewModels="clr-namespace:Money_Transfer_System.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
   <UserControl.DataContext>
      <ViewModels:MainViewModel/>
   </UserControl.DataContext>
   <Grid>
      <TabControl Name="mytabcontrol" SelectionChanged="mytabcontrol_SelectionChanged"
                     ItemsSource="{Binding Tabs}" Margin="10,0" SelectedItem="{Binding TabSelected}" >
         <TabControl.ItemTemplate>
            <DataTemplate >
               <StackPanel Orientation="Horizontal" Name="st">
                  <TextBlock Text="{Binding Header}" Padding="10" />
                  <Button
                            Name="closeButton" 
                            Content="X" Cursor="Hand" DockPanel.Dock="Right" Focusable="False"
                            FontFamily="Courier" FontSize="9" FontWeight="Bold"  Margin="0,1,0,0" 
                            Width="16" Height="16" Padding="0" 
                            Command="{Binding DataContext.RemoveTab,
                            RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                            CommandParameter="{Binding}" />
               </StackPanel>
            </DataTemplate>
         </TabControl.ItemTemplate>
         <TabControl.ContentTemplate>
            <!--this is the body of the TabItem template-->
            <DataTemplate>
               <ContentControl Content="{Binding  Content}"></ContentControl>
               <!--<TextBlock
                    Text="{Binding Content}" />-->
            </DataTemplate>
         </TabControl.ContentTemplate>
      </TabControl>
   </Grid>
</UserControl>

我使用了Visibility转换器,但它不起作用,我希望有人能帮助我。

将此添加到SelectionChanged eventhandler中,以在代码中隐藏按钮:

        if (tabControl.SelectedIndex == 0)
            closeButton.Visibility = Visibility.Hidden;
        else
            closeButton.Visibility = Visibility.Visible;

您可以将
bool
属性
CanClose
添加到
TabItem
类中

public class TabItem
{
   public bool CanClose { get; set; }
   // ...other properties.
}
然后将一个
BooleanToVisibilityConverter的实例添加到
选项卡控件的
资源中

<TabControl Name="mytabcontrol"
            SelectionChanged="mytabcontrol_SelectionChanged"
            ItemsSource="{Binding Tabs}"
            Margin="10,0"
            SelectedItem="{Binding TabSelected}">
   <TabControl.Resources>
      <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
   </TabControl.Resources>
   <!-- ...other code. -->
</TabControl>
最后,为添加的选项卡将
CanClose
属性设置为
true
。默认情况下,在
MainViewModel
的构造函数中,“主页”选项卡将获得
false

private void AddTabItem()
{
   var header = "Tab " + tabs;
   var content = "Content " + tabs;
   var item = new TabItem { Content = content, Header = header, CanClose = true };

   Tabs.Add(item);
   tabs++;
}

作为注释,考虑在<代码> TabIt/<代码>模型中执行<代码> IntIfyPrimyType ,否则对属性的更改将不会在UI中反映。

非常感谢。它是工作的,我很感激您。请您解释一下如何实现(IntIfyPrimTyTrand)。在TabItem中反映了UI中的更改。感谢您的回复,但是这种方式不起作用,因为我无法从后面的代码中找到关闭按钮的名称,下面的帖子解决了这个问题
<Button   Name="closeButton" 
          Visibility="{Binding CanClose, Converter={StaticResource BooleanToVisibilityConverter}}"
          .../>
private void AddTabItem()
{
   var header = "Tab " + tabs;
   var content = "Content " + tabs;
   var item = new TabItem { Content = content, Header = header, CanClose = true };

   Tabs.Add(item);
   tabs++;
}