我正在使用MVVM方法,我的ViewModel中有一个名为DatabasesSubFrame
的对象DataTemplate
来显示ListBox
。我想在Button
下面显示一个ListBox
,它绑定到当前SelectedItem
和DatabasesSubFrame
对象上属于DataTemplate
d的属性
我知道如何通过使用DataContext
在共享祖先上设置ListBox
并使用{Binding /}
来引用当前所选项目。在此示例中,共享祖先是StackPanel
。如果没有明确设置DataContext
,我可以通过DatabasesSubFrame
轻松绑定到{Binding SomeProperty}
对象上的属性。但是,如果我在明确设置的{Binding SomeProperty}
中DataContext
,则会引用错误的DataContext
。
如何在此处访问“原始”DataContext
?我尝试弄乱了RelativeSources和TemplatedParents,但无法弄清楚如何使它们适合。
<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 :(得分:3)
我认为this question 会帮助您找到答案。{另一个技巧是将窗口名称设置为“Root”。然后,您可以使用以下方法获取窗口的原始datacontext:
{Binding ElementName=Root, Path=DataContext.MyViewModelsProperty}