2011-08-02 21 views
3

我有一些代碼看起來是這樣的:爲什麼我無法使用DataContext = {Binding}作爲我的上下文菜單?

<HierarchicalDataTemplate 
    DataType="{x:Type local:SomeType}" 
    ItemsSource="{Binding SomeOtherItems}" 
    > 
    <DockPanel Margin="4"> 
     <DockPanel.ContextMenu> 
      <local:SomeContextMenu DataContext="{Binding}" /> 
     </DockPanel.ContextMenu> 
     <CheckBox IsChecked="{Binding SomeBooleanProperty, Mode=TwoWay}" /> 
     <TextBlock 
      Margin="4,0" 
      Text="{Binding Name}" /> 
    </DockPanel> 
</HierarchicalDataTemplate> 

沒有上下文菜單,一切正常。但是,當我添加這些行:

<DockPanel.ContextMenu> 
    <local:SomeContextMenu DataContext="{Binding}" /> 
</DockPanel.ContextMenu> 

我得到這個(運行時)錯誤的每個元素使用的HierarchicalDataTemplate

System.Windows.Data Error: 3 : Cannot find element that provides DataContext. BindingExpression:(no path); DataItem=null; target element is 'SomeContextMenu' (Name=''); target property is 'DataContext' (type 'Object')

爲什麼做Binding的工作以外的上下文菜單中的一切,但不是用於上下文菜單?

回答

17

首先,DataContext="{Binding}"沒有什麼意義,因爲它會將DataContext綁定到DataContext。這裏的問題可能是ContextMenu不在邏輯樹中,並且由於ContextMenus是浮動彈出窗口,因此其可視化樹已斷開連接。

嘗試通過PlacementTarget綁定的DataContext:

DataContext="{Binding PlacementTarget.DataContext, 
         RelativeSource={RelativeSource Self}}" 
+0

啊,這是有道理的。我最終通過內嵌上下文菜單來解決問題,因爲它只有一個MenuItem,並且只在一個地方使用,但是您的解決方案也可以工作。 –

相關問題