2009-03-22 5 views
1

Im Utilisation du canevas de canevas d'aplication composite pour créer mon application WPF. Dans mon Shell j'ai un tabcontrol qui contient une région pour charger dynamiquement des Vues dans la région. Les vues sont chargées dans de nouveaux onglets dans TabControl.Problème lié à la commande de fermeture de bouton dans un datatemplate Tabcontrol

<TabControl  
     AutomationProperties.AutomationId="MainTabControl" 
     cal:RegionManager.RegionName="{x:Static inf:RegionNames.MainRegion}" 
     Width="Auto" Height="Auto" Margin="10,10,0,0" 
     HorizontalAlignment="Stretch"        
     IsSynchronizedWithCurrentItem="True" 
     ItemTemplate="{StaticResource TabItemTemplate}" 
SelectionChanged="TabControl_SelectionChanged"> 

J'ai un DataTemplate "TabItemTemplate" pour implémenter un CloseButton. Je n'arrive pas à comprendre comment lier la commande du bouton dans le DataTemplate à la commande Close dans le PresentationModel. Si je lier la commande à un CompositCommand, la commande est exécutable. Mais alors je dois comprendre quel onglet on a pressé le bouton de fermeture et seulement exécuter closeCommand dans ce PresentationModel. Voici le dataTemplate.

<DataTemplate x:Key="ClosableTabItemTemplate"> 
      <DockPanel Width="120"> 
       <Button 
        Command="inf:CloseCommands.CloseCommand" 
        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}" 
     VerticalAlignment="Center" 
     /> 
      </DockPanel> 
     </DataTemplate> 

Est-ce que quelqu'un sait comment résoudre ce problème de liaison ??

Répondre

0

J'ai trouvé une solution à ce problème. Le problème était lorsque je lier un UserControl à un TabControl, c'est seulement le datacontext de contentpane qui est mis à l'usercontrol et le datacontext pour l'headerpane est toujours nul. Mais si je définis deux datatemplates, un pour l'élément et un pour le contenu, puis ajoutez le presentationModel à la région, alors dataContext pour l'élément et le contenu est rempli. Je peux alors dans itemTemplate lier à une propriété delegateCommand dans le modèle de présentation.

0

Vous devez soit vous lier à une instance de commande sur votre viewmodel, telle qu'une DelegateCommand exposée par une propriété, soit lier CommandParameter au DataContext du TabItem afin qu'une commande partagée puisse être transmise à l'élément.

+0

J'ai déjà essayé de lier à un DelegateCommand, il ne semble pas fonctionner. Il semble que le DataTemplate ne connaisse pas le DataContext du TabItem. – KaJo

+0

Comment ajoutez-vous votre vue dans la région? (à quoi ressemble votre code?) –

1

J'ai eu le même problème en apprenant Prism et je l'ai contourné en utilisant la liaison d'éléments.

<Button Content="x" Command="{Binding ElementName=Scooby, Path=Content.DataContext.CloseCommand}" /> 

Où Scooby est le nom de la fenêtre de ma coquille et CloseCommand est un prisme DelegateCommand dans le ViewModel de Shell.

Je pensais que je devrais ajouter ceci ici car cela montrerait une alternative à votre solution.

Questions connexes