2009-11-30 193 views
1

我正在使用MVVM方法,並且我有一個來自我的ViewModel的對象DatabasesSubFrame,它是DataTemplated顯示一個ListBox。我想在ListBox下面顯示一個Button,該Button與當前SelectedItemDatabasesSubFrame對象上的一個屬性相結合,該屬性爲DataTemplate d。WPF:在同一個控件中訪問兩個DataContexts

我知道如何引用當前選定的項目,方法是將DataContext設置爲與ListBox共享的祖先,並使用{Binding /}。在這個例子中,共享祖先是StackPanel。如果DataContext未明確設置,則可以通過執行{Binding SomeProperty}輕鬆地綁定到DatabasesSubFrame對象上的屬性。但是,如果我在明確設置DataContext內執行{Binding SomeProperty},則它指的是錯誤的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

它看起來像我可以修改我的數據項持有父視圖模型對象的引用,但似乎有點哈克。 – evilfred 2009-11-30 06:51:01

回答

2

我認爲this question將幫助你找到答案你的。另一個技巧是將窗口的名稱設置爲「根」。然後,您可以通過使用得到窗口的原始的DataContext:

{Binding ElementName=Root, Path=DataContext.MyViewModelsProperty} 
相關問題