tags:

views:

146

answers:

1

Hi,

I am using an MVVM approach, and I have an object from my ViewModel called DatabasesSubFrame which is DataTemplated to show a ListBox. I want to display a Button below the ListBox, which binds to both the currently selected item, and a property on the DatabasesSubFrame object which is being DataTemplated.

I know how to refer to the currently selected item, by setting the DataContext on a shared ancestor with the ListBox and use {Binding /}. In this example the shared ancestor is a StackPanel. And if the DataContext wasn't explicitly set there I could easily bind to a property on the DatabasesSubFrame object by just doing {Binding SomeProperty}. However, if I do {Binding SomeProperty} within the explicitly set DataContext, it refers to the wrong DataContext. How do I access the "original" DataContext here? I tried messing with RelativeSources and TemplatedParents but couldn't figure out how to fit them in.

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

I think this question will help you to find the answer to yours. Another trick is to set the Name of the Window to something like "Root". You can then get at the window's original datacontext by using:

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