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