2009-09-06 19 views
0

J'ai une fenêtre avec deux contrôles: control1 est un contrôle qui a un tas de boutons qui exécutent RoutedCommands; le deuxième contrôle est un TabControl lié à une liste de documents. Le TabControlContentTemplate est un contrôle utilisateur, control2, qui a un ListView. Je voudrais lier le DataContext de control1 au ListView de control2 de l'onglet sélectionné. Voici le code:Liaison au contenu TabItem sélectionné

<Window x:Class="deleteme.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:deleteme" 
    xmlns:sc="clr-namespace:System.Collections;assembly=mscorlib" 
    xmlns:s="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <sc:ArrayList x:Key="Tabs"> 
      <local:Document Name="doc1" /> 
      <local:Document Name="doc2" /> 
      <local:Document Name="doc3" /> 
     </sc:ArrayList> 
    </Window.Resources> 
    <DockPanel> 
     <local:control1 DockPanel.Dock="Left" /> 
     <TabControl DockPanel.Dock="Left" ItemsSource="{StaticResource Tabs}" SelectionChanged="TabControl_SelectionChanged"> 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=Name}" /> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <local:control2 /> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
     </TabControl> 
    </DockPanel> 
</Window> 

<UserControl x:Class="deleteme.control1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:deleteme" 
    x:Name="control"> 
    <StackPanel> 
     <ItemsControl ItemsSource="{DynamicResource Actions}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Button x:Name="actionButton" Content="{Binding Path=Text}" IsEnabled="{Binding Path=actionButton_IsEnabled}" Command="{Binding Path=Command}" CommandTarget="{Binding ElementName=control, Path=DataContext}" Click="actionButton_Click" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </StackPanel> 
</UserControl> 

<UserControl x:Class="deleteme.control2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ScrollViewer> 
      <ListView x:Name="listView" ItemsSource="{Binding Items}" > 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding}" /> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </ScrollViewer> 
    </Grid> 
</UserControl> 

La raison pour laquelle je veux lier le ListView de Control2 à Control1 est double: je peux utiliser ListView.SelectedItem comme paramètre à RoutedCommand.Execute, et je peux utiliser le ListView comme CommandTarget pour que je peut gérer les actions relatives à un document dans control2.

Mon problème est que je ne peux pas comprendre comment lier le ListView de control2 à control1. En fait, il est plus probable que j'aborde mal le problème car je suis nouveau à WPF. Si quelqu'un a une suggestion, je l'apprécierais.

Répondre

1

Ne pensez pas en termes de liaison de la liste, pensez plutôt à la liaison aux données. Je suppose que vous prévoyez les données à utiliser entre les deux contrôles utilisateur; Dans ce cas, tant que vous avez le DataContext plus haut dans l'arbre, les deux contrôles peuvent y accéder.

+0

Merci pour la réponse. Je peux lier assez facilement les données. Je ne veux pas partager les données entre les contrôles cependant - je veux être capable d'appeler RoutedCommand.Execute de control1 en utilisant control2 comme CommandTarget. –