WPF:在同一控件中访问两个DataContexts

时间:2009-11-30 06:25:24

标签: c# .net wpf data-binding datatemplate

我正在使用MVVM方法,我的ViewModel中有一个名为DatabasesSubFrame的对象DataTemplate来显示ListBox。我想在Button下面显示一个ListBox,它绑定到当前SelectedItemDatabasesSubFrame对象上属于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>

1 个答案:

答案 0 :(得分:3)

我认为this question 会帮助您找到答案。{另一个技巧是将窗口名称设置为“Root”。然后,您可以使用以下方法获取窗口的原始datacontext:

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