WPF: доступ к двум DataContexts в одном элементе управления - PullRequest
2 голосов
/ 30 ноября 2009

Я использую подход MVVM, и у меня есть объект из моей ViewModel с именем DatabasesSubFrame, который равен DataTemplate d, чтобы показать 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>

1 Ответ

3 голосов
/ 30 ноября 2009

Я думаю этот вопрос поможет вам найти ответ на свой. Другой трюк заключается в том, чтобы установить для имени окна что-то вроде «Root». Затем вы можете получить исходный текстовый текст окна, используя:

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