2009-11-30 4 views
1

J'utilise une approche MVVM, et j'ai un objet de mon ViewModel appelé DatabasesSubFrame qui est DataTemplate d pour afficher un ListBox. Je souhaite afficher un Button sous le ListBox, qui se lie à la fois à SelectedItem et à une propriété sur l'objet DatabasesSubFrame qui est DataTemplate d.WPF: Accès à deux DataContexts dans le même contrôle

Je sais comment faire référence à l'élément sélectionné, en définissant le DataContext sur un ancêtre commun avec le ListBox et l'utilisation {Binding /}. Dans cet exemple, l'ancêtre partagé est un StackPanel. Et si le DataContext n'était pas explicitement défini là, je pourrais facilement lier à une propriété sur l'objet DatabasesSubFrame en faisant simplement {Binding SomeProperty}. Toutefois, si je fais {Binding SomeProperty} dans le DataContext explicitement défini, il se réfère à la mauvaise DataContext.

Comment puis-je accéder à "l'original" DataContext ici? J'ai essayé de jouer avec RelativeSources et TemplatedParents mais ne pouvait pas comprendre comment les intégrer.

<DataTemplate DataType="{x:Type VM:DatabasesSubFrame}"> 
    <StackPanel DataContext="{Binding Databases}" > 
    <ListBox Name="DbInfoBox" 
       ItemsSource="{Binding}" 
       IsSynchronizedWithCurrentItem="True"> 
     <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Label Content="{Binding ShortName}"/> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <!-- Problem: The Command and V:CreateCommandBinding.Command are set incorrectly here. How do I access OpenDbCommand from the top-level DataTemplate's DataContext? --> 
    <Button Content="Open Database" 
      CommandParameter="{Binding /}" 
      Command="{Binding ???, Path=OpenDbCommand.Command}" 
      V:CreateCommandBinding.Command="{Binding ???, Path=DataContext.OpenDbCommand}"/> 
    </StackPanel> 
</DataTemplate> 
+0

On dirait que je peux modifier mes éléments de données pour contenir une référence à l'objet viewmodel parent, mais qui semble un peu hacky. – evilfred

Répondre

2

Je pense que this question vous aidera à trouver la réponse à la vôtre. Une autre astuce consiste à définir le nom de la fenêtre à quelque chose comme "Root". Vous pouvez alors obtenir à la datacontext originale de la fenêtre en utilisant:

{Binding ElementName=Root, Path=DataContext.MyViewModelsProperty} 
Questions connexes