2017-08-24 3 views
1

J'ai construit une application dans MVVM en utilisant Caliburn Micro. J'ai actuellement le closetab travailler sur tous mes onglets, et il ferme tous les onglets en dehors des trois premiers, qui sont Accueil, Paiement, Notes cependant, je voudrais qu'il ne montre pas l'icône de fermeture de l'onglet sur les trois premiers onglets comme indiqué dans mon code AppViewModel:Comment supprimer les onglets Fermer de l'application Caliburn Micro MVVM?

<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> 

mon code AppViewModel derrière pour l'onglet à proximité:

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); 
    } 
} 

code mon App.xaml pour les 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> 

et enfin la visibilité pour la reliure:

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

Je serais heureux pour toute suggestion car je suis totalement perdu !!

+0

Enveloppez le bouton dans un panneau de protection. créer une propriété 'bool CanClose' si elle n'existe pas déjà. les panneaux liés aux propriétés booléennes se cachent automatiquement lorsque la valeur est fausse – Nkosi

Répondre

0

Créer un panneau de garde pouvant être utilisé pour afficher/masquer le bouton.

<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> 

Ensuite, créez une propriété de garde

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

Par convention, la vue doit se lier automatiquement la propriété CanCloseTab à la visibilité du panneau (frontière) de sorte que lorsque faux ne sera pas affiché. Si le panneau n'était pas là, la propriété de garde aurait également automatiquement désactivé le bouton.

Cela devrait maintenant permettre à la méthode CloseTab d'être refactorisée pour plus de simplicité.

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

Salut, merci pour cette aide. Il n'affiche plus l'icône X sur les onglets mais il laisse un cercle. C'était auparavant une tabulation avec un cercle et un X dedans. Je pense que c'est la ressource dynamique de style qui doit être cachée? –

+0

@JasonB Peut-être un style oui. Le code que vous avez montré n'a aucune indication de quel composant pourrait être la cause du cercle. – Nkosi

+0

Je vais y travailler pour le moment. Certainement plus loin d'où j'étais donc j'ai marqué votre réponse. Les styles sont globaux, donc je ne peux pas les toucher alors je pense que je dois juste regarder la visibilité. –