如何删除 Caliburn Micro MVVM 应用程序中的关闭选项卡?

How to remove the Close Tabs in Caliburn Micro MVVM application?

我已经使用 Caliburn Micro 在 MVVM 中构建了一个应用程序。我目前在我的所有选项卡上都使用了 closettab,它关闭了除前三个选项卡之外的所有选项卡,即主页、付款、备注但是,我希望它不在前三个选项卡上显示关闭选项卡图标,如中所示我的 AppViewModel 代码:

<TabControl x:Name="Items" Grid.Row="1" Visibility="{Binding Visibility, Converter={StaticResource boolToVis}}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <!-- The Tab Names Binding with DisplayName-->
                    <TextBlock Text="{Binding DisplayName}" />
                    <!-- The Tab Close Icon-->
                    <Button Content="x" x:Name="CloseTab" cal:Message.Attach="CloseTab" Style="{DynamicResource appTabCloseButton}" Visibility="{Binding Visibility, Converter={StaticResource boolToVis}}"/>
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

关闭选项卡背后的我的 AppViewModel 代码:

public void CloseTab()
{
    if(ActiveItem.DisplayName == "Home" || ActiveItem.DisplayName == "Payment" || ActiveItem.DisplayName == "Notes")
    {
      MessageBox.Show("This Tab Cannot Be closed.","Permanent Tab");

    } else {
        DeactivateItem(ActiveItem, close: true);
    }  
}

我的 App.xaml boolToVis 代码:

<Application x:Class="WPF.Test.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF.Test.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:Bootstrapper x:Key="bootstrapper" />
                    <BooleanToVisibilityConverter x:Key="boolToVis" />
                </ResourceDictionary>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary Source="/Global.WPF.UserControls;component/Resources/brushes.xaml" />
                        <ResourceDictionary Source="/Global.WPF.UserControls;component/Resources/CommonControls.xaml" />
                        <ResourceDictionary Source="/Global.WPF.UserControls;component/Resources/menuItems.xaml" />
                        <ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Generic.xaml" />
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

最后是绑定的可见性:

bool _visibility;
public bool Visibility
{
    get { return _visibility; }
    set
    {
        _visibility = value;
        NotifyOfPropertyChange("Visibility");
    }
}

我很乐意提出任何建议,因为我完全迷路了!!

创建一个可用于 show/hide 按钮的保护面板。

<TabControl x:Name="Items" Grid.Row="1" Visibility="{Binding Visibility, Converter={StaticResource boolToVis}}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <!-- The Tab Names Binding with DisplayName-->
                <TextBlock Text="{Binding DisplayName}" />
                <Border x:Name="CanCloseTab">
                    <!-- The Tab Close Icon-->
                    <Button Content="x" x:Name="CloseTab" cal:Message.Attach="CloseTab" Style="{DynamicResource appTabCloseButton}" />
                </Border>
            </StackPanel>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

然后创建守卫属性

public bool CanCloseTab {
    get { 
        return !(ActiveItem.DisplayName == "Home" 
                 || ActiveItem.DisplayName == "Payment" 
                 || ActiveItem.DisplayName == "Notes");
    }
}

按照惯例,视图应自动将 CanCloseTab 属性 绑定到面板的可见性(边框),以便在为 false 时不会显示。如果面板不存在,守卫 属性 也会自动禁用该按钮。

为了简单起见,现在应该允许重构 CloseTab 方法。

public void CloseTab() {
    if(CanCloseTab) {
        DeactivateItem(ActiveItem, close: true);
    }  
}