2014-10-30 32 views
1

我對MVVM非常陌生。轉義WPF DataContext

我有下面這段XAML代碼:

<ListBox x:Name="lsbTriggers" ItemsSource="{Binding SelectedProductPart.TriggerViewModels}"> 
      <ListBox.ItemTemplate> 
       <HierarchicalDataTemplate > 
        <ComboBox SelectedItem="{Binding WatchedVariable}" 
        ItemsSource="{Binding SelectedProductPart.AllVariables}" >        
        </ComboBox> 
       </HierarchicalDataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

我試圖讓包含每個TriggerViewModel組合框列表。

組合框的選定項目由TriggerViewModel的WatchedVariable屬性確定。

但是,我希望組合框的ItemsSource是由SelectedProductPart對象提供的變量列表。 我似乎無法做到這一點,因爲datacontext已經「放大」,如果你願意的話,在TriggerViewModels上,由於它是列表的ItemsSource。

我試過在組合框內創建一個新的DataContext,但是這似乎創建了兩個斷開的DataContexts,其中更改組合框的值不會導致TriggerViewModel的WatchedVariable發生更改。

有沒有一種方法,我可以轉義當前的DataContext,所以我可以到SelectedProductPart的AllVariables列表?

+0

http://msdn.microsoft.com/en-us/library/system.windows.data.relativesource(v=vs.110).aspx? – 2014-10-30 16:45:26

回答

1

你必須使用一個Binding明確方式確定它的來源(通過ElementNameSourceRelativeSource)。在這種情況下,我們使用RelativeSource。它有助於走上可視樹和目標基於其類型(AncestorType)來源:

<ListBox x:Name="lsbTriggers" ItemsSource="{Binding SelectedProductPart.TriggerViewModels}"> 
    <ListBox.ItemTemplate> 
     <HierarchicalDataTemplate > 
      <ComboBox SelectedItem="{Binding WatchedVariable}" 
       ItemsSource="{Binding DataContext.SelectedProductPart.AllVariables, 
        RelativeSource={RelativeSource AncestorType=ListBox}}" > 
      </ComboBox> 
     </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

注意Path被換成了DataContext

+1

完美地工作。謝謝! – David 2014-10-31 08:44:56